首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 鎖機制完整解析:鎖類型、相容性、死鎖偵測與解除

     編輯:關於SqlServer

SQL Server 透過鎖管理器自動管理並發控制,保護資料一致性。本文詳細說明各類鎖模式、相容性矩陣、動態管理檢視監控、死鎖成因與處理、以及實務解鎖腳本。

常見鎖類型

鎖模式縮寫用途
共享鎖S讀取資料 (SELECT),允許多筆交易同時持有。
更新鎖U預備修改,防止死鎖,僅允許一筆交易持有。
排他鎖X修改資料 (INSERT/UPDATE/DELETE),獨佔資源。
意圖鎖IS/IX/SIX建立階層鎖結構,保護低層級 S/X 鎖。
結構描述鎖Sch-S / Sch-MDDL 操作或編譯計畫時保護物件結構。
大量更新鎖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';

死鎖偵測與處理

  • 引擎自動偵測循環等待,選擇犧牲者終止交易 (錯誤 1205)。
  • 可用 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 發現熱點資源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved