我們今天主要向大家介紹的是SQL Server資料庫鎖,以及對引入SQL Server資料鎖的原因以及對鎖的區分類別的兩種方法的介紹,以下就是具體內容的描述,希望在你今後的學習中會有所協助。
一. 為什麼要引入鎖
當多個使用者同時對資料庫的並行作業時會帶來以下資料不一致的問題:
丟失更新
A,B兩個使用者讀同一資料並進行修改,其中一個使用者的修改結果破壞了另一個修改的結果,比如訂票系統
髒讀
A使用者修改了資料,隨後B使用者又讀出該資料,但A使用者因為某些原因取消了對資料的修改,資料恢複原值,此時B得到的資料就與資料庫內的資料產生了不一致
不可重複讀取
A使用者讀取資料,隨後B使用者讀出該資料並修改,此時A使用者再讀取資料時發現前後兩次的值不一致
並發控制的主要方法是封SQL Server資料庫鎖,鎖就是在一段時間內禁止使用者做某些操作以避免產生資料不一致
二 鎖的分類
鎖的類別有兩種分法:
1. 從資料庫系統的角度來看:
分為獨佔鎖(即排它鎖),共用鎖定和更新鎖定
MS-SQL Server 使用以下資源鎖模式。
鎖模式 描述
共用 (S) 用於不更改或不更新資料的操作(唯讀操作),如 SELECT 語句。
更新 (U) 用於可更新的資源中。防止當多個會話在讀取、SQL Server資料庫鎖定以及隨後可能進行的資源更新時發生常見形式的死結。
排它 (X) 用於資料修改操作,例如 INSERT、UPDATE 或 DELETE。確保不會同時同一資源進行多重更新。
意圖鎖定 用於建立鎖的階層。意圖鎖定的類型為:意圖共用 (IS)、意向排它 (IX) 以及與意向排它共用 (SIX)。
架構鎖 在執行依賴於表架構的操作時使用。架構鎖的類型為:架構修改 (Sch-M) 和架構穩定性 (Sch-S)。
大容量更新 (BU) 向表中大量複製資料並指定了 TABLOCK 提示時使用。
共用鎖定
共用 (S) 鎖允許並發事務讀取 (SELECT) 一個資源。資源上存在共用 (S) 鎖時,任何其它事務都不能修改資料。一旦已經讀取資料,便立即釋放資源上的共用 (S) 鎖,除非將交易隔離等級設定為可重複讀或更進階別,或者在事務生存周期內用鎖定提示保留共用 (S) 鎖。
更新鎖定
更新 (U) 鎖可以防止通常形式的死結。一般更新模式由一個事務組成,此事務讀取記錄,擷取資源(頁或行)的共用 (S) 鎖,然後修改行,此操作要求鎖轉換為排它 (X) 鎖。如果兩個事務獲得了資源上的共用模式鎖,然後試圖同時更新資料,則一個事務嘗試將鎖轉換為排它 (X) 鎖。共用模式到排它鎖的轉換必須等待一段時間,因為一個事務的排它鎖與其它事務的共用模式鎖不相容;發生鎖等待。第二個事務試圖擷取排它 (X) 鎖以進行更新。由於兩個事務都要轉換為排它 (X) 鎖,並且每個事務都等待另一個事務釋放共用模式SQL Server資料庫鎖,因此發生死結。
若要避免這種潛在的死結問題,請使用更新 (U) 鎖。一次只有一個事務可以獲得資源的更新 (U) 鎖。如果事務修改資源,則更新 (U) 鎖轉換為排它 (X) 鎖。否則,鎖轉換為共用鎖定。
排它鎖
排它 (X) 鎖可以防止並發事務對資源進行訪問。其它事務不能讀取或修改排它 (X) 鎖鎖定的資料。
意圖鎖定
意圖鎖定表示 SQL Server 需要在階層中的某些底層資源上擷取共用 (S) 鎖或排它 (X) 鎖。例如,放置在表級的共用意圖鎖定表示事務打算在表中的頁或行上放置共用 (S) 鎖。在表級設定意圖鎖定可防止另一個事務隨後在包含那一頁的表上擷取排它 (X) 鎖。意圖鎖定可以提高效能,因為 SQL Server 僅在表級檢查意圖鎖定來確定事務是否可以安全地擷取該表上的鎖。而無須檢查表中的每行或每頁上的鎖以確定事務是否可以鎖定整個表。
意圖鎖定包括意圖共用 (IS)、意向排它 (IX) 以及與意向排它共用 (SIX)。
鎖模式 描述
意圖共用 (IS) 通過在各資源上放置 S 鎖,表明事務的意向是讀取階層中的部分(而不是全部)底層資源。
意向排它 (IX) 通過在各資源上放置 X 鎖,表明事務的意向是修改階層中的部分(而不是全部)底層資源。IX 是 IS 的超集。
與意向排它共用 (SIX) 通過在各資源上放置 IX 鎖,表明事務的意向是讀取階層中的全部底層資源並修改部分(而不是全部)底層資源。允許頂層資源上的並發 IS 鎖。例如,表的 SIX 鎖在表上放置一個 SIX 鎖(允許並發 IS 鎖),在當前所修改頁上放置 IX 鎖(在已修改行上放置 X 鎖)。雖然每個資源在一段時間內只能有一個 SIX 鎖,以防止其它事務對資源進行更新,但是其它事務可以通過擷取表級的 IS 鎖來讀取階層中的底層資源。
獨佔鎖:
只允許進行鎖定操作的程式使用,其他任何對他的操作均不會被接受。執行資料更新命令時,SQL Server會自動使用獨佔鎖。當對象上有其他鎖存在時,無法對其加獨佔鎖。
共用鎖定:共用鎖定鎖定資源可以被其他使用者讀取,但其他使用者無法修改它,在執行Select時,SQL Server會對對象加共用鎖定。
更新鎖定:
當SQL Server準備更新資料時,它首先對資料對象作更新鎖定鎖定,這樣資料將不能被修改,但可以讀取。等到SQL Server確定要進行更新資料操作時,他會自動將更新鎖定換為獨佔鎖,當對象上有其他鎖存在時,無法對其加更新鎖定。
2. 從程式員的角度看:分為樂觀鎖和悲觀鎖。
樂觀鎖:完全依靠資料庫來管理鎖的工作。
悲觀鎖:程式員自己管理資料或對象上的SQL Server資料庫鎖處理。
MS-SQLSERVER 使用鎖在多個同時在資料庫內執行修改的使用者間實現封閉式並行存取控制