.瞭解鎖
鎖定是資料庫引擎用來同步多個使用者同時對同一個資料區塊的訪問的一種機制。
在事務擷取資料區塊目前狀態的依賴關係之前,它必須保護自己不受其他事務對同一資料進行修改的影響。
鎖粒度和階層
RID 用於鎖定堆中的單個行的行標識符。
KEY 索引中用於保護可序列化事務中的鍵範圍的行鎖。
PAGE 資料庫中的 8 KB 頁,例如資料頁或索引頁。
EXTENT 一組連續的八頁,例如資料頁或索引頁。
HOBT 堆或 B 樹。保護索引或沒有叢集索引的表中資料頁堆的鎖。
TABLE 包括所有資料和索引的整個表。
FILE 資料庫檔案。
APPLICATION 應用程式專用的資源。
METADATA 中繼資料鎖。
ALLOCATION_UNIT 配置單位。
DATABASE 整個資料庫。
鎖模式:
共用鎖定(S):用於唯讀操作(SELECT),鎖定共用的資源。共用鎖定不會阻止其他使用者讀,但是阻止其他的使用者寫和修改。
排他(獨佔)鎖(X): 用於資料修改操作,例如 INSERT、UPDATE 或 DELETE。確保不會同時對同一資源進行多重更新。
更新鎖定(U): 當更新交易資料需要擷取排它鎖時,必須先擷取更新瑣。引擎為防止死結的發生,一次允許允許一個事務可以獲得資源的更新鎖定(U 鎖),只有擷取更新鎖定的查詢才可建立排它鎖。
意圖鎖定: 用於建立鎖的階層。意圖鎖定的類型有:意圖共用 (IS)、意向排他 (IX) 以及意向排他共用 (SIX)。引擎在建立共用鎖定和獨佔鎖之前,先使用意圖鎖定來保護共用鎖定(S 鎖)或獨佔鎖定(X 鎖)放置在鎖階層的底層資源上
架構鎖(Sch-M):執行表的資料定義語言 (Data Definition Language) (DDL) 操作時使用架構鎖。在架構修改鎖起作用的期間,該鎖之外的所有操作都將被阻止.
大容量更新鎖定(BU 鎖):當將資料大量複製到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 設定了 table lock on bulk 表選項時,將使用大容量更新鎖定。大容量更新鎖定(BU 鎖)允許多個線程將資料並發地大量載入到同一表,同時防止其他不進行大量載入資料的進程訪問該表。
監視與管理鎖
使用 SQL Server Profiler監視Locks 事件,來捕獲有關跟蹤中鎖事件的資訊的鎖事件類別目錄。
使用系統監視器監視SQL Server Locks 對象,監視資料庫引擎執行個體中的鎖層級。
查詢 sys.dm_tran_locks 動態管理檢視獲得有關資料庫引擎 執行個體中鎖目前狀態的資訊。
使用系統預存程序sp_lock (Transact-SQL) 返回有關資料庫引擎執行個體中的活動鎖的資訊。對於 SQL Server 2005,請改用 sys.dm_tran_locks 動態管理檢視。
使用系統檢視表sys.syslockinfo (Transact-SQL)返回有關資料庫引擎 執行個體中的活動鎖的資訊。對於 SQL Server 2005,請改用 sys.dm_tran_locks 動態管理檢視。
將死結減至最少
按同一順序訪問對象。
避免事務中的使用者互動。
保持事務簡短並處於一個批處理中。
使用較低的隔離等級。
使用基於資料列版本設定的隔離等級。
將 READ_COMMITTED_SNAPSHOT 資料庫選項設定為 ON,使得已提交讀事務使用資料列版本設定。
使用快照隔離。
使用綁定串連。