SqlServer死锁与阻塞检测脚本
发布时间:2020-12-12 13:12:27 所属栏目:MsSql教程 来源:网络整理
导读:IF EXISTS (SELECT * FROM sysobjects WHERE [name] = 'sp_Lock_Scan')DROP PROCEDURE sp_Lock_ScanGOCREATE PROCEDURE sp_Lock_ScanASDECLARE @SPID INTDECLARE @BLK INTDECLARE @Count INTDECLARE @Counter INTDECLARE @LOCK BITCREATE TABLE #Temp([Id] I
IF EXISTS (SELECT * FROM sysobjects WHERE [name] = 'sp_Lock_Scan') DROP PROCEDURE sp_Lock_Scan GO CREATE PROCEDURE sp_Lock_Scan AS DECLARE @SPID INT DECLARE @BLK INT DECLARE @Count INT DECLARE @Counter INT DECLARE @LOCK BIT CREATE TABLE #Temp ( [Id] INT IDENTITY,[SPID] INT,[BLOCK] INT ) SELECT @LOCK = 0 IF @@ERROR <> 0 RETURN @@ERROR INSERT INTO #Temp ( [SPID],[BLOCK] ) SELECT 0,[blocked] FROM ( SELECT * FROM [master]..[sysprocesses] WHERE [blocked] > 0 ) a WHERE NOT EXISTS ( SELECT * FROM [master]..[sysprocesses] WHERE a.[blocked] = [spid] AND [blocked] > 0 ) UNION SELECT [spid],[blocked] FROM [master]..[sysprocesses] WHERE [blocked] > 0 IF @@ERROR <> 0 RETURN @@ERROR SELECT @Count = COUNT(*),@Counter = 1 FROM #Temp IF @@ERROR <> 0 RETURN @@ERROR IF @Count = 0 BEGIN SELECT N'没有阻塞和死锁信息' [ScanMessage] RETURN 0 END ELSE BEGIN WHILE @Counter <= @Count BEGIN IF EXISTS ( SELECT * FROM #Temp a WHERE a.[Id] > @Counter AND EXISTS ( SELECT * FROM #Temp WHERE [Id] <= @Counter AND a.[BLOCK] = [SPID] ) ) BEGIN SELECT @LOCK = 1 SELECT @SPID = [SPID],@BLK = [BLOCK] from #Temp WHERE [Id] = @Counter SELECT N'引起数据库死锁的是:【' + CAST(@SPID AS NVARCHAR(255)) + N'】进程,其执行的SQL语言如下' [ScanMessage] SELECT @SPID [SPID],@BLK [BLOCKED] DBCC INPUTBUFFER(@SPID) DBCC INPUTBUFFER(@BLK) END SELECT @Counter = @Counter + 1 END IF @LOCK = 0 BEGIN SELECT @Counter = 1 WHILE @Counter <= @Count BEGIN SELECT @SPID = [SPID],@BLK = [BLOCK] FROM #Temp where [Id] = @Counter IF @SPID = 0 SELECT N'引起阻塞的是:【'+ CAST(@BLK AS NVARCHAR(255)) + '】,其执行的SQL语法如下' [ScanMessage] ELSE SELECT N'进程【' + CAST(@SPID AS NVARCHAR(255)) + N'】被进程【' + CAST(@BLK AS NVARCHAR(255)) + N'】阻塞,当前进程的SQL语法如下' [ScanMessage] DBCC INPUTBUFFER(@SPID) DBCC INPUTBUFFER(@BLK) SELECT @Counter = @Counter + 1 END END END RETURN 0 GO (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |