日期:2014-05-16  浏览次数:20390 次

常看到死锁的问题,一般都是KILL进程,但如果不查出引起死锁的原因,死锁会时常发生 可以通过查找引起死锁的的操作,就可以方便的解决死锁,现将日常解决问题的方法总

常看到死锁的问题,一般都是KILL进程,但如果不查出引起死锁的原因,死锁会时常发生
可以通过查找引起死锁的的操作,就可以方便的解决死锁,现将日常解决问题的方法总结,也许对大家有帮助

1\死锁发生时,通过如下语法,查询出引起死锁的操作

use master
go
declare @spid int,@bl int
DECLARE s_cur CURSOR FOR?
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
OPEN s_cur
FETCH NEXT FROM s_cur INTO @spid,@bl
WHILE @@FETCH_STATUS = 0
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 )
FETCH NEXT FROM s_cur INTO @spid,@bl
end
CLOSE s_cur
DEALLOCATE s_cur

exec sp_who2
2\查找程序/数据库,此t_sql语法在什么地方使用
3\分析找到的,并解决问题

EG:

/*
-------------------------------------------------------?
引起数据库死锁的是: 71进程号,其执行的SQL语法如下

EventType? ?? ?Parameters EventInfo? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
-------------- ---------- ------------------------------------------------?
Language Event 0? ?? ?? ??
select * from test
insert test values(1,2)


(所影响的行数为 1 行)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
------------------------------------------?
进程号SPID:64被进程号SPID:71阻塞,其当前进程执行的SQL语法如下

EventType? ?? ?Parameters EventInfo? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
-------------- ---------- ------------------------------------------------?
Language Event 0? ?? ?? ??
select * from test
insert test values(1,2)


(所影响的行数为 1 行)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
------------------------------------------?
进程号SPID:65被进程号SPID:64阻塞,其当前进程执行的SQL语法如下

EventType? ?? ?Parameters EventInfo? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
-------------- ---------- --------------------------------------------------------------?
Language Event 0? ?? ?? ? begin tran
select * from test with (holdlock)
waitfor time '12:00'
select * from test
commit

(所影响的行数为 1 行)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
------------------------------------------?
进程号SPID:73被进程号SPID:64阻塞,其当前进程执行的SQL语法如下

EventType? ?? ?Parameters EventInfo? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
-------------- ---------- --------------------------------------------------------------?
Language Event 0? ?? ?? ? begin tran
select * from test with (holdlock)
waitfor time '12:00'
select * from test
commit

(所影响的行数为 1 行)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
*/