1. 程式人生 > >分析死鎖的方法

分析死鎖的方法

常看到死鎖的問題,一般都是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 輸出了錯誤資訊,請與系統管理員聯絡。
*/