SQL Server 透過鎖管理器自動管理並發控制,保護資料一致性。本文詳細說明各類鎖模式、相容性矩陣、動態管理檢視監控、死鎖成因與處理、以及實務解鎖腳本。
| 鎖模式 | 縮寫 | 用途 |
|---|---|---|
| 共享鎖 | S | 讀取資料 (SELECT),允許多筆交易同時持有。 |
| 更新鎖 | U | 預備修改,防止死鎖,僅允許一筆交易持有。 |
| 排他鎖 | X | 修改資料 (INSERT/UPDATE/DELETE),獨佔資源。 |
| 意圖鎖 | IS/IX/SIX | 建立階層鎖結構,保護低層級 S/X 鎖。 |
| 結構描述鎖 | Sch-S / Sch-M | DDL 操作或編譯計畫時保護物件結構。 |
| 大量更新鎖 | BU | 大量匯入時允許平行載入,阻擋非大量操作。 |
| 鍵範圍鎖 | RangeS/RangeX | 可序列化隔離等級下防止幻讀。 |
若資源已被鎖定,新請求僅在模式相容時授予。例如:X 鎖與任何鎖皆不相容;S 鎖相容 S/U,不相容 X。詳細矩陣請參考官方文件。
SELECT resource_type, request_mode, resource_description,
request_session_id, DB_NAME(resource_database_id) AS db_name
FROM sys.dm_tran_locks
WHERE resource_type <> 'DATABASE';
sys.dm_tran_locks、SQL Server Profiler 死鎖圖形事件分析。KILL 終止造成阻塞的工作階段。-- 查詢被鎖資料表
SELECT request_session_id AS spid,
OBJECT_NAME(resource_associated_entity_id) AS tableName
FROM sys.dm_tran_locks
WHERE resource_type = 'OBJECT';
-- 解鎖:終止 SPID
DECLARE @spid INT = 57;
EXEC('KILL ' + @spid);
NOLOCK (讀取未認可資料) 或 ROWLOCK 提示。sys.dm_tran_locks 發現熱點資源。