查询Sql server数据库死锁的存储过程

发布时间:2019-07-29编辑:脚本学堂
本文介绍下,一个可用于查询sql server数据库中死锁的存储过程,有需要的朋友,参考下吧。

一般在sql server中,当死锁出现以后,维护人员或开发人员大多通过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

在查询分析器中执行:
sql server死锁查询

exec sp_who_lock

直到最后的结果为:
sql server死锁

是不是很方便呢?以后再遇到sql server的死锁,调出这个存储过程,问题马上可以解决了。