善待自己,珍惜今天,恩泽他人,享受生活

不放弃任何解决困难的机会,人的一生就是解决困难的过程。 当我们走完一生才能说没有问题要解决了。 面对工作、生活上的压力,面对来自家庭、朋友、同事、上司等的困惑。 要排除万难,否则我们就会被万难排除!

博客园 首页 新随笔 联系 订阅 管理

使用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

直到最后的结果为:

posted on 2012-02-23 11:15  笨笨丁  阅读(253)  评论(0编辑  收藏  举报