微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlserver查询是否有死锁

/************************************************************
* Code formatted by SoftTree sql Assistant ?v6.5.258
* Time: 2014/11/12 5:46:41
************************************************************/


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
 
--return 0    
--KILL 64

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐