MSSQL 死鎖根因深度解析:四大必要條件、六種鎖模式、轉換鎖與鍵範圍鎖全景圖
死鎖是併發系統的噩夢。本文從操作系統層面剖析死鎖四大必要條件,系統梳理 SQL Server 七大鎖模式(共享/獨占/更新/意向/特殊/轉換/鍵範圍),繪製鎖相容性矩陣思維圖,為死鎖排查與預防提供理論基石。
一、 什麼是死鎖
兩個或以上進程因爭奪資源造成互相等待,無外力無法推進。系統處於死鎖狀態,涉及進程稱死鎖進程。
二、 死鎖產生的四個必要條件(同時滿足)
- 互斥條件:資源排他使用,同一時刻僅一進程佔用。
- 請求保持條件:持有資源又請求新資源,請求阻塞時不釋放已有資源。
- 不剝奪條件:已獲資源未用完前不能被強行奪取,只能主動釋放。
- 環路等待條件:存在進程-資源環形鏈 P0→R1→P1→R2...→Pn→R0→P0。
破壞任一條件即可避免死鎖:如資源有序申請(破環路)、一次性申請所有資源(破請求保持)、允許搶佔(破不剝奪)。
三、 SQL Server 核心鎖模式全景
1. 共享鎖
- 讀操作(SELECT)獲取,防止讀時被寫修改。
- 兼容:多事務可同時持有同一資源的 S 鎖。
- 默認讀已提交隔離級別下,讀完即釋放;可通過 HOLDLOCK/TABLOCKX 或提高隔離級別延長持有。
2. 獨占鎖
- 寫操作(INSERT/UPDATE/DELETE)獲取,排他性佔用資源。
- 不兼容任何其他鎖(含 S、U、X)。
- 持有至事務提交/回滾(嚴格兩階段鎖協議)。
3. 更新鎖
- 混合鎖:查找階段獲取 U 鎖,修改階段轉 X 鎖。
- 兼容 S 鎖,但同一資源同一時間僅允許一個 U 鎖。
- 作用:序列化「查找→更新」轉換,避免 S→X 升級死鎖(轉換死鎖)。
- 持有至事務結束或轉 X 鎖。
4. 意向鎖
- 不鎖定數據,標識「下層已有鎖」,協調層級衝突。
- IS(意向共享):將加 S 鎖於行/頁 → 先獲取表級 IS。
- IX(意向獨占):將加 X/U 鎖於行/頁 → 先獲取表級 IX。
- IU(意向更新):將加 U 鎖於頁 → 先獲取表級 IU。
- 兼容矩陣:IS/IX/IU 互兼容;S 與 IX/IU 衝突;X 與所有衝突。
5. 特殊鎖模式
- Sch-S(架構穩定鎖):編譯/執行計劃時持有,防止 DDL 修改結構。兼容除 Sch-M 外所有鎖。
- Sch-M(架構修改鎖):DDL(ALTER/DROP)持有,排他性,阻塞所有其他鎖。
- BU(大容量更新鎖):
BULK INSERT / BCP 並行導入時持有,允許並發 BU,阻塞其他寫操作。
6. 轉換鎖
- 非直接申請,由鎖升級/組合產生。
- SIX:持有 S 再獲 IX(掃描表同時插入行)。
- SIU:持有 S 再獲 IU。
- UIX:持有 U 再獲 IX。
- 最常見 SIX:全表掃描(S)+ 並發插入(IX)。
7. 鍵範圍鎖
- 可序列化隔離級別專用。
- 鎖定索引鍵範圍,防止幻讀(範圍內禁止插入)。
- 模式:RangeS-S, RangeS-U, RangeI-N, RangeX-X 等。
四、 鎖相容性速查矩陣(核心模式)