SqlServer死锁检测

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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server死锁是指在数据库中发生的两个或多个事务相互等待对方所持有的资源而导致的无法继续执行的情况。SQL Server数据库引擎会自动检测死锁,并选择其中一个会话作为死锁受害者终止事务,并显示错误以打破死锁。 解决SQL Server死锁问题的方法有两种: 1. 使用Update lock语法:对于先读后写类型的操作,可以使用带有updlock参数的select语句,这样可以在读取数据的同时锁定该数据,避免死锁的发生。例如:select * from table1 with(updlock) where ... 2. 调整程序逻辑:如果死锁是由于程序的BUG导致的,除了使用上述方法外,还应该仔细分析程序的逻辑。尽量避免同时锁定两个资源,如果必须同时锁定两个资源,要按照相同的顺序来锁定资源,以避免死锁的发生。 通过采取这些方法,可以有效地解决SQL Server死锁问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SQL Server的死锁说明](https://blog.csdn.net/Long_xu/article/details/130075691)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Sql Server 数据库死锁介绍和解决方法](https://blog.csdn.net/qq_41024101/article/details/116952205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值