如何处理Sql server中的死锁问题

2025-10-27 23:42:35

1、用数据库sa用户登录。

2、创建民激查询死锁的存储过程。

--找引发锁的sql

create  procedure pro_killsid

as 

begin 

declare @spid int,@bl int, 

@intTransactionCountOnEntry  int, 

@intRowcount    int, 

@intCountProperties   int, 

@intCounter    int

create table #tmp_lock_who ( 

id int identity(1,1), 

spid smallint, 

bl smallint)

IF @@ERROR<薪囊>0 RETURN @@ERROR

insert into #tmp_lock_who(spid,bl) select  0 ,blocked 

from (select * from sysprocesses where  blocked>0 ) a 

where not exists(select * from (select * from sysprocesses where  blocked>0 ) b 

where a.blocked=spid) 

union select spid,blocked from sysprocesses where  blocked>0

IF @@ERROR<>0 RETURN @@ERROR 

select  @intCountProperties = Count(*),@intCounter = 1 

from #tmp_lock_who

IF @@ERROR<>0 RETURN @@ERROR

if @intCountProperties=0 

select '现在没有阻塞和死锁信息' as message

while @intCounter <= @intCountProperties 

begin 

select  @spid = spid,@bl = bl 

from #tmp_lock_who where Id = @intCounter 

begin 

if @spid =0 

select '引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + '进程号。其执行的SQL语法如下' 

else 

select '进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其当前进程执行的SQL语法如下' 

DBCC INPUTBUFFER (@bl ) 

end

set @intCounter = @intCounter + 1 

end

drop table #tmp_lock_who

return 0 

end

3、执行创建的存储过程。

用master执行存储过程:execute  pro_killsid

4、Kill掉死锁的进程SID号。

5、再用master执行存储过程:execute  pro_killsid

检测是否还有死锁。三阅欠 

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢