Hibernate 的 LockMode

名詞解釋:

悲觀鎖 :

在應用程序中顯示地爲數據資源加鎖.悲觀鎖假定當前事務操縱數據資源時,肯定還會有其它事務同時訪問該數據資源,爲了避免當前事務的操作受到干擾,先鎖定資源.儘管悲觀鎖能防止丟失更新和不可重複讀這類併發問題,但會影響併發性能.

樂觀鎖 :

假定當前事務操縱數據資源時,不會有其它事務同時訪問該數據資源,因此完全依靠數據庫的隔離級別來自動管理鎖的工作.應用程序採用版本控制手段來避免可能出現的併發問題.

::::::::::::::LockMode類表示的幾種鎖定模式:::::::::::::

 

鎖定模式

描述

LockMode.NONE

如果緩存中存在對象,直接返回該對象的引用,否則通過select語句到數據庫中加載該對象,默認值.

LockMode.READ

不管緩存中是否存在對象,總是通過select語句到數據庫中加載該對象,如果映射文件中設置了版本元素,就執行版本檢查,比較緩存中的對象是否和數據庫中對象版本一致

LockMode.UPGRADE

不管緩存中是否存在對象,總是通過select語句到數據庫中加載該對象,如果映射文件中設置了版本元素,就執行版本檢查,比較緩存中的對象是否和數據庫中對象的版本一致,如果數據庫系統支持悲觀鎖(如Oracle/MySQL),就執行select...for update語句,如果不支持(如Sybase),執行普通select語句

LockMode.UPGRADE_NOWAIT

和LockMode.UPGRADE具有同樣功能,此外,對於Oracle等支持update nowait的數據庫,執行select...for update nowait語句,nowait表明如果執行該select語句的事務不能立即獲得悲觀鎖,那麼不會等待其它事務釋放鎖,而是立刻拋出鎖定異常

LockMode.WRITE

保存對象時會自動使用這種鎖定模式,僅供Hibernate內部使用,應用程序中不應該使用它

LockMode.FORCE

強制更新數據庫中對象的版本屬性,從而表明當前事務已經更新了這個對象

 

 

 

多個事務併發運行時的併發問題

第一類丟失更新:撤銷一個事務時,把其它事務已提交的更新數據覆蓋.

第二類丟失更新:不可重複讀中的特例,一個事務覆蓋另一事務已提交的更新數據.

髒讀:一個事務讀到另一事務未提交的更新數據.

幻讀:一個事務讀到另一事務已提交的新插入的數據.

不可重複讀:一個事務讀到另一個事物已提交的更新數據.

 

鎖的類型和兼容性

共享鎖

l  加鎖條件:當一個事務執行select語句時,數據庫系統會爲這個事務分配一把共享鎖,鎖定被查詢的數據.

l  解鎖條件:數據被讀取後,數據庫系統立即解除共享鎖.

l  與其它鎖的兼容性:如果數據資源上放置了共享鎖,還能再放置共享鎖和更新鎖.

l  併發性能:良好的併發性能.當多個事務讀相同數據時,每個事務都會獲得一把共享鎖,可以同時讀鎖定的數據.

獨佔鎖

l  加鎖條件:當一個事務執行insert,update,delete時,數據庫系統會自動對SQL語句操縱的數據資源使用獨佔鎖.如果該數據資源已經有其它鎖存在時,無法對其再放置獨佔鎖.

l  解鎖條件:獨佔鎖一直到事務結束後才能被解除.

l  與其它鎖的兼容性:獨佔鎖不能和其他鎖兼容,如果數據資源已經加上了獨佔鎖, 就不能再放置其它鎖,同樣,如果已經有了其它鎖,就不能放置獨佔鎖.

l  併發性能:併發性能較差,只允許有一個事務訪問鎖定的數據,如果其他事務也需要訪問該數據,就必須等待,直到前一個事務結束,解除了獨佔鎖,其它事務才能訪問該數據.

更新鎖

l  加鎖條件:當一個事務進行update操作時,數據庫系統會先爲事務分配一把更新鎖.

l  解鎖條件:當讀取數據完畢,執行更新操作時,會把更新鎖升級爲獨佔鎖.

l  與其它鎖的兼容性:更新鎖與共享鎖兼容,即一個資源可以同時放置更新鎖和共享鎖,但是最多隻能放置一把更新鎖,這樣,當多個事務更新相同的數據時,只有一個事務能獲得更新鎖,然後再把更新鎖升級爲獨佔鎖,其它事務必須等到前一個事務結束後,才能獲得更新鎖,避免了死鎖.

l  併發性能:允許多個事務同時讀鎖定資源,但不允許其它事務修改它.

 

各種隔離級別所能避免的併發問題

隔離級別

是否出現第一類丟失更新

是否出現第二類丟失更新

是否出現髒讀

是否出現幻讀

是否出現不可重複讀

Serializable串行化

RepeatableRead可重複讀

ReadCommited讀已提交數據

ReadUncommited讀未提交數據

 

 

--------------------------------------------------------------------------------------------------我是分割線--------------------------------------------------------------------------------------------

以上內容引自 :

gary0416
http://gary0416.iteye.com/blog/888682  的博客 如有版權問題 請及時通知刪除
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章