死鎖由兩個互相阻塞的執行緒組成,雙方等待對方釋放資源。SQL Server 中常見於**兩個事務存在相反操作順序**:
死鎖監視器定期偵測,選擇「回滾成本最低」的犧牲者終止,拋出錯誤 1205 (舊版 1025)。
SQL Server 2005+ 支援 **快照隔離 (Snapshot Isolation / Read Committed Snapshot)**:
限制:寫/寫衝突 (雙方更新同一資源) 仍可能死鎖,需從業務邏輯層面避免逆向操作。
ALTER DATABASE SET READ_COMMITTED_SNAPSHOT ONSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 或查詢提示 (NOLOCK)| 層面 | 檢核項目 | 驗收標準 |
|---|---|---|
| 架構 | 是否啟用 READ_COMMITTED_SNAPSHOT | OLTP 核心庫強制啟用 |
| 程式碼 | 所有預存程序鎖表順序一致 | Code Review 強制檢查 |
| 程式碼 | 無使用者互動在事務中 | 靜態分析/人工審查 |
| 程式碼 | 大批量 DML 已分批 | 單批 < 5000 列或 < 2 秒 |
| 索引 | UPDATE/DELETE 皆有對應索引 | 執行計畫無 Table Scan/Index Scan |
| 監控 | 死錯誤 1205 警報與重試機制 | 應用層指數退避重試 3 次 |
死鎖理論上無法完全避免,但可透過「快照隔離解決讀寫衝突 + 統一順序/縮短事務/前置查詢解決寫寫衝突」將發生率壓至極低。關鍵在於**架構層面啟用快照隔離**與**開發規範強制統一存取順序**,並建立監控告警與自動重試機制。