長時間未認可/回滾的交易會持續持有鎖定資源,阻塞其他連線,甚至引發死結。掌握目前資料庫中「開啟中交易」的狀況,是 DBA 排查阻塞與效能異常的基本功。
master..sysprocesses:open_tran > 0 表示該 SPID 有開啟交易;spid 為處理序識別碼。DBCC INPUTBUFFER(spid):取得該 SPID 最近執行的 255 字元指令(需 sysadmin 權限)。SET NOCOUNT ON;
DECLARE @Commands TABLE (
ctr INT IDENTITY NOT NULL,
command VARCHAR(2000) NOT NULL
);
INSERT @Commands (command)
SELECT 'DBCC INPUTBUFFER (' + CONVERT(VARCHAR(10), spid) + ')'
FROM master..sysprocesses
WHERE open_tran > 0;
DECLARE @ctr INT = 1, @command VARCHAR(2000);
WHILE @ctr < (SELECT COUNT(*) + 1 FROM @Commands)
BEGIN
SELECT @command = command FROM @Commands WHERE ctr = @ctr;
PRINT '-- ' + @command;
EXECUTE (@command);
SET @ctr = @ctr + 1;
END;
KILL spid 釋放資源(謹慎執行,確認業務影響)。透過 sysprocesses.open_tran 快速定位開啟交易,再以 DBCC INPUTBUFFER 還原指令內容,能精準鎖定阻塞源頭,縮短事故處理時間,保障資料庫服務穩定性。