-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_who2 | EXEC sp_who2 | 快速查看所有 SPID、阻塞鏈、登錄時間、執行命令 |
| sysprocesses | SELECT * FROM sysprocesses WHERE blocked <> 0 | 程序化檢測阻塞進程 |
| 企業管理器/SSMS | 管理 → 當前活動 → 進程信息 | 圖形化查看、右鍵 Kill |
| SQL Profiler (事件探查器) | 工具 → SQL Server Profiler → 新建跟蹤 → 鎖事件 | 根因分析:捕獲 Deadlock Graph、Lock:Deadlock Chain |
Deadlock graph (XML 圖形)Lock:DeadlockLock:Deadlock ChainDeadlock 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;
READ COMMITTED SNAPSHOT (RCSI) 或 SNAPSHOT,減少共享鎖持有時間-- 開啟死鎖跟蹤旗標 (輸出到錯誤日志)
DBCC TRACEON(1204, 1222, -1);
-- 1204: 文字格式死鎖圖
-- 1222: XML 格式死鎖圖 (推薦)
-- -1: 全局生效
死鎖本質是並發事務以不同順序請求相同資源。殺進程只能治標,統一訪問順序、縮短事務、合理索引、啟用 RCSI 才能治本。建議建立死鎖監控告警,定期分析 Deadlock graph 持續優化熱點業務。