名詞解釋:
悲觀鎖 :
在應用程序中顯示地爲數據資源加鎖.悲觀鎖假定當前事務操縱數據資源時,肯定還會有其它事務同時訪問該數據資源,爲了避免當前事務的操作受到干擾,先鎖定資源.儘管悲觀鎖能防止丟失更新和不可重複讀這類併發問題,但會影響併發性能.
樂觀鎖 :
假定當前事務操縱數據資源時,不會有其它事務同時訪問該數據資源,因此完全依靠數據庫的隔離級別來自動管理鎖的工作.應用程序採用版本控制手段來避免可能出現的併發問題.
::::::::::::::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讀未提交數據 |
否 |
是 |
是 |
是 |
是 |
--------------------------------------------------------------------------------------------------我是分割線--------------------------------------------------------------------------------------------
以上內容引自 :