博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sqlserver 出现sql被锁时,查看加锁和被锁的sql
阅读量:4312 次
发布时间:2019-06-06

本文共 1744 字,大约阅读时间需要 5 分钟。

原文:

DECLARE @spid INT

DECLARE @blk INT
DECLARE @count INT
DECLARE @index INT
DECLARE @lock TINYINT
 
SET @lock=0
 
CREATE TABLE #temp_who_lock
  (
     id   INT IDENTITY(1, 1),
     spid INT,
     blk  INT
  )
 
--if @@error<>0 return @@error    
INSERT INTO #temp_who_lock
            (spid,
             blk)
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(*),
       @index = 1
FROM   #temp_who_lock
 
--select @count,@index
 
--if @@error<>0 return @@error    
IF @count = 0
  BEGIN
      SELECT '没有阻塞和死锁信息'
  --return 0    
  END
 
WHILE @index <= @count
  BEGIN
      IF EXISTS(SELECT 1
                FROM   #temp_who_lock a
                WHERE  id > @index
                       AND EXISTS(SELECT 1
                                  FROM   #temp_who_lock
                                  WHERE  id <= @index
                                         AND a.blk = spid))
        BEGIN
            SET @lock=1
 
            SELECT @spid = spid,
                   @blk = blk
            FROM   #temp_who_lock
            WHERE  id = @index
 
            SELECT  '引起数据库死锁的是: ' + Cast(@spid AS VARCHAR(10)) + '进程号,其执行的SQL语法如下' ;
 
            SELECT @spid,
                   @blk
 
        
 
            DBCC inputbuffer(@spid)
             
 
            DBCC inputbuffer(@blk)
        END
 
      SET @index=@index + 1
  END
 
IF @lock = 0
  BEGIN
      SET @index=1
 
      WHILE @index <= @count
        BEGIN
            SELECT @spid = spid,
                   @blk = blk
            FROM   #temp_who_lock
            WHERE  id = @index
 
            IF @spid = 0
              SELECT '引起阻塞的是:' + Cast(@blk AS VARCHAR(10)) + '进程号,其执行的SQL语法如下'
            ELSE
              SELECT '进程号SPID:' + Cast(@spid AS VARCHAR(10)) + '被' + '进程号SPID:' + Cast(@blk AS VARCHAR(10)) + '阻塞,其当前进程执行的SQL语法如下'
 
            PRINT ( LTRIM(@spid) + ''+ LTRIM(@blk));
            if(@spid <> 0)
            BEGIN
               DBCC inputbuffer(@spid)   --
             END
 
            DBCC inputbuffer(@blk)   --引起阻塞语句
 
            SET @index=@index + 1
        END
  END
 
DROP TABLE #temp_who_lock

 

 

 

 

------------------

posted on
2019-01-23 15:06 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/10309066.html

你可能感兴趣的文章
Windows 8.1 应用开发 – 触控操作
查看>>
PowerDesigner创建物理模型
查看>>
使用Git、Git GUI和TortoiseGit
查看>>
vue---canvas实现二维码和图片合成的海报
查看>>
检查项目里是否有IDFA的方法
查看>>
64位系统使用Access 数据库文件的彻底解决方法
查看>>
注释,字符串
查看>>
性能瓶颈
查看>>
cmd 导入数据库
查看>>
Makefile书写注意事项--个人择记(一)
查看>>
文件转码重写到其他文件
查看>>
场景3 Data Management
查看>>
Dubbo入门---搭建一个最简单的Demo框架(转)
查看>>
树结构练习——排序二叉树的中序遍历
查看>>
AC自动机模板
查看>>
python 基本语法
查看>>
Oracle JDBC hang on
查看>>
inotify+rsync实现实时热备
查看>>
C#杂问
查看>>
Cocoapods的使用教程
查看>>