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

MSSQL 死鎖根因深度解析:四大必要條件、六種鎖模式、轉換鎖與鍵範圍鎖全景圖

     編輯:MySQL 綜合教學

MSSQL 死鎖根因深度解析:四大必要條件、六種鎖模式、轉換鎖與鍵範圍鎖全景圖

死鎖是併發系統的噩夢。本文從操作系統層面剖析死鎖四大必要條件,系統梳理 SQL Server 七大鎖模式(共享/獨占/更新/意向/特殊/轉換/鍵範圍),繪製鎖相容性矩陣思維圖,為死鎖排查與預防提供理論基石。

一、 什麼是死鎖

兩個或以上進程因爭奪資源造成互相等待,無外力無法推進。系統處於死鎖狀態,涉及進程稱死鎖進程。

二、 死鎖產生的四個必要條件(同時滿足)

  1. 互斥條件:資源排他使用,同一時刻僅一進程佔用。
  2. 請求保持條件:持有資源又請求新資源,請求阻塞時不釋放已有資源。
  3. 不剝奪條件:已獲資源未用完前不能被強行奪取,只能主動釋放。
  4. 環路等待條件:存在進程-資源環形鏈 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 等。

四、 鎖相容性速查矩陣(核心模式)

五、 死鎖排查實戰思路

  1. 開啟 Trace Flag 1222 或擴展事件捕獲死鎖圖。
  2. 分析死鎖圖:識別參與進程、持有鎖、請求鎖、SQL 文本、索引名。
  3. 常見模式:
    • 不同順序訪問同表:事務 A 鎖表 1→表 2,事務 B 鎖表 2→表 1。修復:統一業務邏輯加鎖順序。
    • 索引缺失導致表掃描升級表鎖:修復:補充索引,縮小鎖粒度。
    • 鍵範圍鎖衝突:可序列化級別下範圍插入衝突。修復:降低隔離級別或優化範圍查詢。
  4. 應用層:重試邏輯、超時設置、冪等設計。

掌握鎖模式與相容性,死鎖從「不可預測的隨機事件」變為「可分析、可預防的工程問題」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
請求\持有SUXISIXIU
S✅✅❌✅❌✅
U✅❌❌✅❌❌
X❌❌❌❌❌❌
IS✅✅❌✅✅✅
IX❌❌❌✅✅❌
IU✅❌❌✅❌✅