加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读