首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL Server 死鎖排查與處理實戰:錯誤 -2147467259 完整解決方案

     編輯:MySQL 資料庫相關知識

現象

-2147467259 Your transaction (process ID #30) was deadlocked 
with another process and has been chosen as the deadlock victim.

快速緩解:殺死阻塞進程

存儲過程:按數據庫殺死所有連接

USE master;
GO
CREATE PROC sp_kill_db_spids @dbname sysname
AS
BEGIN
    DECLARE @sql nvarchar(500), @spid int;
    SET @sql = N'DECLARE cur CURSOR FOR 
        SELECT spid FROM sysprocesses WHERE dbid = DB_ID(''' + @dbname + ''')';
    EXEC(@sql);
    OPEN cur;
    FETCH NEXT FROM cur INTO @spid;
    WHILE @@FETCH_STATUS = 0
    BEGIN
        EXEC('KILL ' + @spid);
        FETCH NEXT FROM cur INTO @spid;
    END
    CLOSE cur; DEALLOCATE cur;
END
GO

-- 用法
EXEC sp_kill_db_spids 'YourDatabaseName';

死鎖診斷四大入口

方法命令/路徑適用場景
sp_who / sp_who2EXEC sp_who2快速查看所有 SPID、阻塞鏈、登錄時間、執行命令
sysprocessesSELECT * FROM sysprocesses WHERE blocked <> 0程序化檢測阻塞進程
企業管理器/SSMS管理 → 當前活動 → 進程信息圖形化查看、右鍵 Kill
SQL Profiler (事件探查器)工具 → SQL Server Profiler → 新建跟蹤 → 鎖事件根因分析:捕獲 Deadlock Graph、Lock:Deadlock Chain

Profiler 捕獲死鎖圖步驟

  1. 啟動 SQL Server Profiler
  2. 文件 → 新建跟蹤 → 連接服務器
  3. 事件選擇頁籤 → 勾選 Locks 類別下的:
    • Deadlock graph (XML 圖形)
    • Lock:Deadlock
    • Lock:Deadlock Chain
  4. 運行跟蹤,重現死鎖場景
  5. 分析 Deadlock graph 事件:顯示受害者、持有鎖資源、等待鎖資源、涉及語句

鎖資源類型查詢

SELECT 
    req_spid AS [進程ID],
    DB_NAME(rsc_dbid) AS [數據庫],
    CASE rsc_type
        WHEN 1 THEN 'NULL'
        WHEN 2 THEN 'DATABASE'
        WHEN 3 THEN 'FILE'
        WHEN 4 THEN 'INDEX'
        WHEN 5 THEN 'TABLE'
        WHEN 6 THEN 'PAGE'
        WHEN 7 THEN 'KEY'
        WHEN 8 THEN 'EXTENT'
        WHEN 9 THEN 'RID'
        WHEN 10 THEN 'APP'
    END AS [鎖類型],
    rsc_objid, rsc_indid
FROM master..syslockinfo;

根治策略:代碼層面優化

  1. 統一訪問順序:所有事務按相同順序訪問表/行(如按主鍵升序),打破循環等待條件
  2. 縮短事務:只在事務中放必要語句,避免用戶交互、遠程調用、長時間計算
  3. 降低隔離級別:讀密集業務用 READ COMMITTED SNAPSHOT (RCSI) 或 SNAPSHOT,減少共享鎖持有時間
  4. 索引優化:缺失索引導致掃描鎖升級為表鎖,補齊索引可將鎖粒度降至行級
  5. 避免長事務:批量操作分批提交,每批 1000-5000 行
  6. 死鎖重試邏輯:應用層捕獲 1205 錯誤碼,指數退避重試 3 次

配置優化

-- 開啟死鎖跟蹤旗標 (輸出到錯誤日志)
DBCC TRACEON(1204, 1222, -1);
-- 1204: 文字格式死鎖圖
-- 1222: XML 格式死鎖圖 (推薦)
-- -1: 全局生效

總結

死鎖本質是並發事務以不同順序請求相同資源。殺進程只能治標,統一訪問順序、縮短事務、合理索引、啟用 RCSI 才能治本。建議建立死鎖監控告警,定期分析 Deadlock graph 持續優化熱點業務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved