-- 方法一:追蹤旗標
DBCC TRACEON(1204, 1222, -1);
-- 方法二:SQL Server Profiler 事件
-- Locks → Deadlock graph
死鎖圖顯示:共享鎖 (S) 與排他鎖 (X) 相互等待
| Session 1 | Session 2 |
|---|---|
| 持有 S 鎖,請求 X 鎖 | 持有 X 鎖,請求 S 鎖 |
錯誤日誌關鍵資訊:
初步判斷: 主鍵上發生 S/X 鎖衝突,推測原因:
深入詢問: 確認表結構、觸發器腳本、主鍵生成邏輯。
「原來是其他人在這個表中建立了觸發器,我不知道,並且這個觸發器還訪問了這個表。」
移除觸發器後,死鎖問題消失。
讀寫/寫讀衝突循環:
Session A: 讀取資源 1 (S) → 請求資源 2 (X) Session B: 寫入資源 2 (X) → 請求資源 1 (S) 結果:雙方互相等待,形成死鎖
READPAST、NOLOCK 謹慎處理READ COMMITTED SNAPSHOT (RCSI)「死鎖常見場景是讀寫寫讀衝突,循環引用造成相互資源排斥。建議解決方式:縮短交易處理時間,減少循環引用。」