• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    查询Sqlserver数据库死锁的一个存储过程分享

    使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉。利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里.

    创建sp_who_lock存储过程

    CREATE procedure sp_who_lock 
    as   
    begin   
      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   
     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语法如下'   
      dbcc inputbuffer(@spid)  
      dbcc inputbuffer(@blk)   
      set @index=@index+1   
     end   
     end   
     drop table #temp_who_lock   
     return 0   
    end 
    GO
    

    在查询分析器中执行:

    exec sp_who_lock

    直到最后的结果为:**

    您可能感兴趣的文章:
    • mysql 数据库死锁原因及解决办法
    • Mysql 数据库死锁过程分析(select for update)
    • 简单说明Oracle数据库中对死锁的查询及解决方法
    • InnoDB数据库死锁问题处理
    • Mybatis update数据库死锁之获取数据库连接池等待
    • MySQL数据库的一次死锁实例分析
    • 讲解Oracle数据库中结束死锁进程的一般方法
    • 记一次公司仓库数据库服务器死锁过程及解决办法
    • MySQL数据库之Purge死锁问题解析
    • 5分钟快速了解数据库死锁产生的场景和解决方法
    上一篇:sql 聚集索引和非聚集索引(详细整理)
    下一篇:SQL语句的并集UNION 交集JOIN(内连接,外连接)等介绍
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    查询Sqlserver数据库死锁的一个存储过程分享 查询,Sqlserver,数据库,死锁,