2015-01-31 28 views
1
HibernateTemplate().refresh(obj, LockMode.UPGRADE); 

上面的代碼是否會阻塞所有線程,包括不同機器上的線程繼續執行?春季休眠鎖是否適用於不同機器上的其他線程?

此外,何時將此鎖釋放?

是否在hibernate會話結束?

當釋放鎖定時獲取鎖定並喚醒現有線程有多昂貴? 謝謝

+0

此外,如果obj具有對其他實體(表)的外部引用,那麼所有其他錶行也會被鎖定嗎?由於鎖在db,我假設所有進程(即使在不同的機器上)都會被阻塞,如果他們試圖獲取同一個obj上的鎖(但是obj與db中的一行不一樣)。表參考) – StackFish 2015-02-01 19:22:34

回答

0

Hibernate鎖定請求委託給數據庫,因此不會發生內存中的Java鎖定。

LockMode.Upgradeequivalent to PESSIMISTIC_WRITE,意思是在關聯的數據庫行上進行獨佔鎖定。

當前鎖定將阻止其他事務獲取此特定行的共享/排它鎖,直到您當前的事務結束(提交或回滾)。

如果其他線程不需要採取此特定的數據庫行鎖定,則不會發生爭用。

線程不會被喚醒,就像Java中發生的一樣。等待鎖的數據庫進程永遠不會進入休眠狀態。您也可以配置鎖定採集的時間間隔。