PESSIMISTIC_WRITE
を使用する必要があります クエリ時:
Query q = session
.createQuery("from MyObject n where n.state = 'NEW'")
.setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();
親オブジェクトをロックするだけで十分です。デッドロックは必ずしも発生しません。ロックを保持しているスレッドが、別のスレッドが待機をタイムアウトする前にロックを解放しないと、ロックの取得に失敗する可能性があります。
Oracleを使用しているので、これが更新のために選択 動作:
したがって、T1が一部の行で排他ロックを取得した場合、T1がコミットまたはロールバックするまで、T2はそれらのレコードを読み取ることができません。 T2が