使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁, 死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉。利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里.
创建sp_who_lock存储过程
CREATE
procedure
sp_who_lock
as
begin
declare
@spid
int
@blk
int
@
count
int
@
index
int
@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
(
*
master..sysprocesses
where
blocked>0)a
where
not
exists(
from
a.blocked =spid
and
blocked>0)
union
spid,blocked
blocked>0
@@error
count
=
(*),@
index
=1
#temp_who_lock
@@error
if @
=0
begin
select
'没有阻塞和死锁信息'
0
end
while @
<=@
count
begin
if exists(
1
#temp_who_lock a
id>@
index
#temp_who_lock
id<=@
a.blk=spid))
begin
@lock=1
@spid=spid,@blk=blk
id=@
index
select
@spid,@blk
dbcc inputbuffer(@spid)
dbcc inputbuffer(@blk)
end
=@
+1
end
if @lock=0
begin
=1
count
begin
index
if @spid=0
'引起阻塞的是:'
+
cast
(@blk
as
varchar
(10))+
sql string" style="white-space:pre-wrap; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.8em!important; margin:0px!important; outline:rgb(0,其执行的sql语法如下'
else
dbcc inputbuffer(@spid)
dbcc inputbuffer(@blk)
+1
end
end
drop
#temp_who_lock
0
end
GO
|
在查询分析器中执行:
exec sp_who_lock
直到最后的结果为:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。