說道死鎖問題的解決,一般情況下我們都是選擇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 輸出了錯誤信息,請與系統管理員聯系。
*/
新聞熱點
疑難解答