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

sqlserver查询是否有死锁

发布时间:2020-12-12 12:52:25 所属栏目:MsSql教程 来源:网络整理
导读:/************************************************************* Code formatted by SoftTree SQL Assistant ?v6.5.258* Time: 2014/11/12 5:46:41************************************************************/DECLARE @spid INTDECLARE @blk INTDECLAR
/************************************************************
* 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

(编辑:李大同)

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

    推荐文章
      热点阅读