我正面臨一個問題,即通過使用get(Serializable,Class,LockOptions)
方法和LockOptions.UPGRADE
獲取該行的鎖。休眠:它是否在get()和LockOptions.UPGRADE後重新加載對象
正在獲取鎖定的對象已存在於會話中。 一旦執行select ... for update,我發現如果在對象的初始提取後和在get(Serializable,Class,LockOptions)
之前,表中對應的行已被更改,則該方法不返回更新的對象。
我想澄清以下內容, 這是因爲我試圖獲取對象已在會話緩存中加載的行的鎖定。
Hibernate只是在後臺觸發select ... for update
,但不會重新加載對象,而是如果找到會從會話緩存中獲取一個?
以下是我如何獲取鎖定的代碼片段。
List<MyObject> listOfMyObject = dao.getListOfMyObjects();
for(MyObject m : listOfMyObject){
m = session.get(id,MyObject.class,LockOptions.UPGRADE);
//
}
鎖定機制工作正常。讓我們說讓ThreadOne事務處理鎖,我可以看到另一個ThreadTwo事務正在等待獲取鎖。現在,當ThreadOne事務釋放鎖時,第二個事務通過session.get(id,MyObject.class,LockOptions.UPGRADE)
方法獲取它,返回的對象沒有ThreadOne完成的更新值。