1
HibernateTemplate().refresh(obj, LockMode.UPGRADE);
上面的代碼是否會阻塞所有線程,包括不同機器上的線程繼續執行?春季休眠鎖是否適用於不同機器上的其他線程?
此外,何時將此鎖釋放?
是否在hibernate會話結束?
當釋放鎖定時獲取鎖定並喚醒現有線程有多昂貴? 謝謝
HibernateTemplate().refresh(obj, LockMode.UPGRADE);
上面的代碼是否會阻塞所有線程,包括不同機器上的線程繼續執行?春季休眠鎖是否適用於不同機器上的其他線程?
此外,何時將此鎖釋放?
是否在hibernate會話結束?
當釋放鎖定時獲取鎖定並喚醒現有線程有多昂貴? 謝謝
Hibernate鎖定請求委託給數據庫,因此不會發生內存中的Java鎖定。
LockMode.Upgrade
是equivalent to PESSIMISTIC_WRITE,意思是在關聯的數據庫行上進行獨佔鎖定。
當前鎖定將阻止其他事務獲取此特定行的共享/排它鎖,直到您當前的事務結束(提交或回滾)。
如果其他線程不需要採取此特定的數據庫行鎖定,則不會發生爭用。
線程不會被喚醒,就像Java中發生的一樣。等待鎖的數據庫進程永遠不會進入休眠狀態。您也可以配置鎖定採集的時間間隔。
此外,如果obj具有對其他實體(表)的外部引用,那麼所有其他錶行也會被鎖定嗎?由於鎖在db,我假設所有進程(即使在不同的機器上)都會被阻塞,如果他們試圖獲取同一個obj上的鎖(但是obj與db中的一行不一樣)。表參考) – StackFish 2015-02-01 19:22:34