常用脚本--查看死锁和阻塞usp_who_lock

复制代码
USE [master]
GO

/****** Object:  StoredProcedure [dbo].[sp_who_lock]    Script Date: 02/07/2014 11:51:24 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[usp_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 )
IF @spid>0
DBCC INPUTBUFFER (@spid )
END 

-- 循环指针下移
SET @intCounter = @intCounter + 1
END

DROP TABLE #tmp_lock_who

RETURN 0
END
GO


--===============================
--Usage
EXEC [master].[dbo].[usp_who_lock]
复制代码

 

posted on   笑东风  阅读(834)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

导航

点击右上角即可分享
微信分享提示