在master數據庫下創建一下存儲過程,然后可以通過 exec sp_who_lock 來查看死鎖。然后通過Kill 命令,可以殺死死鎖。
USE [master]; GO SET ANSI_NULLS ON; GO SET QUOTED_IDENTIFIER OFF; GO CREATE PROCEDURE [dbo].[sp_who_lock] AS BEGIN DECLARE @spid INT , @bl INT , @intTransactionCountOnEntry INT , @intRowcount INT , @intCountProperties INT , @intCounter INT; CREATE TABLE #tmp_lock_who ( id INT IDENTITY(1, 1) , spid SMALLINT , bl SMALLINT ); IF @@ERROR <> 0 RETURN @@ERROR; INSERT INTO #tmp_lock_who( spid ,bl) SELECT 0 ,blocked FROM ( SELECT * FROM sysprocesses WHERE blocked > 0 ) a WHERE NOT EXISTS ( SELECT * FROM ( SELECT * FROM sysprocesses WHERE blocked > 0 ) b WHERE a.blocked = spid ) UNION SELECT spid ,blocked FROM sysprocesses WHERE blocked > 0; IF @@ERROR <> 0 RETURN @@ERROR; -- 找到臨時表的記錄數 SELECT @intCountProperties = COUNT(*) ,@intCounter = 1 FROM #tmp_lock_who; IF @@ERROR <> 0 RETURN @@ERROR; IF @intCountProperties = 0 SELECT '現在沒有阻塞和死鎖信息' AS message; -- 循環開始 WHILE @intCounter <= @intCountProperties BEGIN -- 取第一條記錄 SELECT @spid = spid ,@bl = bl FROM #tmp_lock_who WHERE id = @intCounter; BEGIN IF @spid = 0 SELECT '引起數據庫死鎖的是: ' + CAST(@bl AS VARCHAR(10)) + '進程號,其執行的SQL語法如下'; ELSE SELECT '進程號SPID:' + CAST(@spid AS VARCHAR(10)) + '被' + '進程號SPID:' + CAST(@bl AS VARCHAR(10)) + '阻塞,其當前進程執行的SQL語法如下'; DBCC INPUTBUFFER (@bl ); END; -- 循環指針下移 SET @intCounter = @intCounter + 1; END; DROP TABLE #tmp_lock_who; RETURN 0; END;