事務4.3-事務與鎖(鎖)
數據庫和操作系統一樣,是一個多用戶使用的共享資源。當多個用戶並發地存取數據時,在數據庫中就會產生多個事務同時存取同一數據的情況。若對並發操作不加控制就可能會讀取和存儲不正確的數據,破壞數據庫的一致性。加鎖是實現數據庫並 發控制的一個非常重要的技術。在實際應用中經常會遇到的與鎖相關的異常情況,當兩個事務需要一組有沖突的鎖,而不能將事務繼續下去的話,就會出現死鎖,嚴重影響應用的正常執行。
鎖模式
1.共享鎖(S鎖):允許並發事務在封閉式並發控制下讀取(select)資源。資源上存在共享鎖時,任何其他事務都不能修改數據。讀取操作一完成,就立即釋放資源的共享鎖,除非事務隔離級別設置為可重復讀或更高級別,或者在事務持續時間內用鎖定提示保留共享鎖。
2.更新鎖(U鎖):更新鎖是共享鎖和排它鎖的結合。更新鎖意味著在做一個更新時,一個共享鎖在掃描完成符合條件的數據後可能會轉化成排它鎖。
這裏面有兩個步驟:(1)掃描獲取where條件時,這部分是一個更新查詢,此時是一個更新鎖。
(2)如果將執行寫入更新,此時該鎖升級到排他鎖,否則,該鎖轉變成共享鎖。
更新鎖可以防止常見的死鎖
3.排它鎖(X鎖):可以防止並發實物對資源進行訪問。排它鎖不與其他任何鎖兼容。使用排它鎖時,任何其他事物都無法修改數據,也不可讀取,僅在使用NOLOCK提示或未提交讀隔離級別時才會進行讀取操作。
共享鎖和排它鎖的區別:當數據對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的數據對象可以被其他事務讀取,但不能修改。數據庫利用這兩 種基本的鎖類型來對數據庫的事務進行並發控制。
悲觀鎖:悲觀鎖是指假設並發更新沖突會發生,所以不管沖突是否真的發生都會使用鎖機制。
悲觀鎖會完成以下功能:鎖住讀取的記錄,防止其他事務讀取和更新這些記錄。其他事務會一直阻塞,知道這個事務結束。
悲觀鎖實在使用了數據庫的事務隔離功能的基礎上,獨享占用的資源,一次保證讀取數據一致性,避免修改丟失。
悲觀鎖可以使用Repeatable Read事務,他完全買組悲觀鎖的要求。
樂觀鎖:樂觀鎖不會鎖住任何東西,也就是說,它不依賴數據庫的事務機制,樂觀鎖完全是應用系統層面的東西。
如果使用樂觀鎖,那麽數據庫就必須加版本字段,否則就只能比較所有字段,但因為浮點類型不能比較,所以實際上沒有版本字段是不可行的。
事務4.3-事務與鎖(鎖)