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

SQL Server 死鎖進程查詢與強制關閉完整流程

     編輯:關於SqlServer

三步驟處理死鎖

步驟 1:查詢被鎖定表格與進程

SELECT 
    Request_Session_Id AS SPID,
    OBJECT_NAME(Resource_Associated_Entity_Id) AS TableName
FROM Sys.dm_Tran_Locks
WHERE Resource_Type = 'OBJECT';

回傳 SPID(鎖定進程 ID)與 TableName(被鎖定表名)。

步驟 2:查詢進程所在主機

EXEC Sp_Who2 'SPID_Value';  -- 替換實際 SPID

結果包含 HostName、ProgramName、LoginName 等資訊,定位來源應用/主機。

步驟 3:強制關閉進程

DECLARE @SPID INT = 57;  -- 目標 SPID
DECLARE @SQL VARCHAR(1000) = 'KILL ' + CAST(@SPID AS VARCHAR);
EXEC(@SQL);

進階:批次偵測與終止長時間阻塞

-- 查詢阻塞鏈
SELECT 
    Blocking_Session_Id AS Blocker,
    Session_Id AS Victim,
    Wait_Type,
    Wait_Time_Ms,
    Wait_Resource
FROM Sys.dm_Os_Waiting_Tasks
WHERE Blocking_Session_Id > 0;

-- 自動生成 KILL 指令(謹慎使用)
DECLARE @KillCmd NVARCHAR(MAX) = '';
SELECT @KillCmd += 'KILL ' + CAST(Blocking_Session_Id AS VARCHAR) + '; '
FROM Sys.dm_Os_Waiting_Tasks
WHERE Blocking_Session_Id > 0 AND Wait_Time_Ms > 30000;  -- 超過 30 秒
-- PRINT @KillCmd;  -- 先檢視再執行
-- EXEC Sp_ExecuteSql @KillCmd;

風險提示

  • KILL 會觸發交易回滾,長交易回滾時間可能更久
  • 優先嘗試:通知應用端正常結束、優化查詢、調整隔離等級
  • 需 PROCESSADMIN 或 SYSADMIN 權限
  • 生產環境建議建立監控告警而非自動 KILL

總結

死鎖處理標準流程:DMV 定位表與 SPID → Sp_Who2 定位主機 → KILL 終止進程。輔以阻塞鏈監控、應用端優化,從根源減少死鎖發生。

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