zoukankan      html  css  js  c++  java
  • 找到死锁的进程并取消该死锁的存储过程

    --邹建  
      create   proc   sp_lockinfo  
      @kill_lock_spid   bit=1,             --是否杀掉阻塞的进程,1   杀掉,   0   仅显示  
      @show_spid_if_nolock   bit=1,   --如果没有阻塞的进程,是否显示正常进程信息,1   显示,0   不显示  
      @dbname   sysname=''                     --如果为空,则查询所有的库,如果为null,则查询当前库,否则查询指定库  
      as  
      set   nocount   on  
      declare   @count   int,@s   nvarchar(2000),@dbid   int  
      if   @dbname=''   set   @dbid=db_id()   else   set   @dbid=db_id(@dbname)  
       
      select   id=identity(int,1,1),标志,  
      进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid,  
      数据库名=db_name(dbid),用户ID=uid,用户名=loginame,累计CPU时间=cpu,  
      登陆时间=login_time,打开事务数=open_tran,进程状态=status,  
      工作站名=hostname,应用程序名=program_name,工作站进程ID=hostprocess,  
      域名=nt_domain,网卡地址=net_address  
      into   #t   from(  
      select   标志='阻塞的进程',  
      spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,  
      status,hostname,program_name,hostprocess,nt_domain,net_address,  
      s1=a.spid,s2=0  
      from   master..sysprocesses   a   join   (  
      select   blocked   from   master..sysprocesses    
      where   blocked>0  
      and(@dbid   is   null   or   dbid=@dbid)  
      group   by   blocked  
      )b   on   a.spid=b.blocked    
      where   a.blocked=0  
      and(@dbid   is   null   or   dbid=@dbid)  
      union   all  
      select   '|_牺牲品_>',  
      spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,  
      status,hostname,program_name,hostprocess,nt_domain,net_address,  
      s1=blocked,s2=spid  
      from   master..sysprocesses   a    
      where   blocked<>0  
      and(@dbid   is   null   or   dbid=@dbid)  
      )a   order   by   s1,s2  
       
      select   @count=@@rowcount  
       
      if   @count=0   and   @show_spid_if_nolock=1  
      begin  
      insert   #t  
      select   标志='正常的进程',  
      spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,  
      open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address  
      from   master..sysprocesses  
      where   @dbid   is   null   or   dbid=@dbid  
      order   by   spid  
      set   @count=@@rowcount  
      end  
       
      if   @count>0  
      begin  
      create   table   #t1(id   int   identity(1,1),a   nvarchar(30),b   Int,EventInfo   nvarchar(255))  
      declare   tb   cursor   local  
      for  
      select   N'insert   #t1   exec(''dbcc   inputbuffer('+rtrim(进程ID)+')'')  
      if   @@rowcount=0   insert   #t1(a)   values(null)  
      '+case   when   @kill_lock_spid=1   and   标志=N'阻塞的进程'  
      then   'kill   '+rtrim(进程ID)   else   ''   end  
      from   #t  
      open   tb  
      fetch   tb   into   @s  
      while   @@fetch_status=0  
      begin  
      exec(@s)  
      fetch   tb   into   @s  
      end  
      close   tb  
      deallocate   tb  
      select   a.*,进程的SQL语句=b.EventInfo  
      from   #t   a   join   #t1   b   on   a.id=b.id  
      order   by   a.ID  
      end  
      set   nocount   off  
      go  
  • 相关阅读:
    【C#】项目优化实战
    【NoSql】Redis
    【算法】非递归的方式生成树
    工作4年的一些想法
    【NoSql】MongoDb
    【微信开发】 前端
    【微信开发】常用 api
    [MVC] DIV 布局
    [Swift] 疑难杂症
    《你不懂我,我不怪你》
  • 原文地址:https://www.cnblogs.com/yzwdli/p/1407586.html
Copyright © 2011-2022 走看看