メソッドを使用してLockOptions.UPGRADE
を使用して行のロックを取得する問題に直面しています。Hibernate:LockOptions.UPGRADEでget()の後にオブジェクトをリロードしますか
ロックが取得されているオブジェクトは、すでにセッションに存在しています。 select ...を実行すると、テーブルの対応する行がオブジェクトの最初のフェッチの後で、get(Serializable,Class,LockOptions)
の前に変更された場合、メソッドは更新されたオブジェクトを返さないことを確認しています。
私は次のことを明確にしたいと思います。 これは、オブジェクトがすでにセッションキャッシュにロードされている行のロックを取得しようとしているためです。
Hibernateはバックグラウンドでselect ... for update
を起動しますが、オブジェクトをリロードしませんが、見つかった場合はセッションキャッシュから1つをフェッチしますか?
以下は、私がどのようにロックを取得しているかのコードスニペットです。
List<MyObject> listOfMyObject = dao.getListOfMyObjects();
for(MyObject m : listOfMyObject){
m = session.get(id,MyObject.class,LockOptions.UPGRADE);
//
}
ロック機構が正常に動作しています。ロックが保持されている間、ThreadOneトランザクションを実行すると、他のThreadTwoトランザクションがロックの獲得を待っていることがわかります。今度は、ThreadOneトランザクションがロックを解放すると、2番目のトランザクションはsession.get(id,MyObject.class,LockOptions.UPGRADE)
メソッドを使用して取得します。返されるオブジェクトには、ThreadOneによって更新された値がありません。