查询数据库中进程死锁情况脚本。

查询数据库中进程死锁情况,脚本。

USE [master]
GO
/****** Object:  StoredProcedure [dbo].[sp_who_lock]    Script Date: 04/26/2012 11:13:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[sp_who_lock]
AS
BEGIN
	DECLARE @spid int,
		@bl int,
		@intTransactionCountOnEntry  int,
        @intRowcount    int,
        @intCountProperties   int,
        @intCounter    int
	
	DECLARE @tmp_lock_who TABLE
	(
		id INT IDENTITY(1,1),
		spid SMALLINT,
		bl SMALLINT
	)
	
	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

	-- 找到临时表的记录数
	SELECT  @intCountProperties = Count(*),@intCounter = 1
	FROM @tmp_lock_who
	
	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
END

其它查询正在执行进程信息

WITH tb
AS
(
	SELECT blocking_session_id,session_id,DB_NAME(database_id) as dbname, [text]
	FROM master.Sys.dm_exec_requests a
	CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle)
),
tb1 as
(
	SELECT a.*,login_time,program_name,client_interface_name,login_name,cpu_time,memory_usage*8 as 'memory_usage(KB)',
	total_scheduled_time,reads,writes,logical_reads
	FROM tb a
	INNER JOIN master.sys.dm_exec_sessions b ON a.session_id=b.session_id
)

SELECT a.*,connect_time,client_tcp_port,client_net_address
FROM tb1 a INNER JOIN master.sys.dm_exec_connections b ON a.session_id=b.session_id
GO


-- 查出互相死锁的进程信息
USE MASTER
GO
SELECT a.*
FROM	sysprocesses a, sysprocesses b
WHERE	a.blocked > 0 and
            b.blocked > 0 and
            a.spid != b.spid and
            a.blocked = b.spid and
            b.blocked = a.spid
GO 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值