首先建立乙個標量值函式diglock,用來遞迴檢測sqlserver中的每乙個會話是否存在加鎖迴圈,如果該函式最終返回1則表示檢測到了加鎖迴圈 (也就是說檢測到了死鎖),如果最終返回0則表示沒有檢測到加鎖迴圈。
1然後定義乙個檢視v_deadlock_process,呼叫上面建立的函式,如果查詢出了結果說明當前sql server中存在死鎖create
function
[dbo
].[diglock]2
(3@spid
int,
4@orginspid
int5)6
returns
bit7as8
begin
9declare
@blockedspid
int=
null;10
11select
@blockedspid
=spid from sysprocesses where blocked<>
0and blocked=
@spid
1213
if@blockedspid
=@orginspid
14return
1;--
檢測到了死鎖
1516
if@blockedspid
isnot
null
17begin
18return dbo.diglock(@blockedspid,@orginspid
);19
end20
21return
0;--
未檢測到死鎖
22end
1查詢檢視v_deadlock_process,如果當前sql server中存在死鎖的話就會顯示查詢到了記錄create
view
[dbo
].[v_deadlock_process]2
as3select
spid, kpid, blocked, waittype, waittime, lastwaittype, waitresource, dbid, uid, cpu, physical_io, memusage, login_time,
4last_batch, ecid, open_tran, status, sid, hostname, program_name, hostprocess, cmd, nt_domain, nt_username,
5net_address, net_library, loginame, context_info, sql_handle, stmt_start, stmt_end, request_id
6from sys.sysprocesses as
sp17
where (blocked <>
0) and (dbo.diglock(spid, spid) =
1)
select上圖顯示,53號會話鎖住了54號會話,54號會話又鎖住了53號會話,所以當前sql server中存在死鎖。*from
[dbo
].[v_deadlock_process
]
然後可以使用dbcc inputbuffer語句傳入上面檢視查詢到的會話spid,找到造成死鎖的sql語句
dbcc inputbuffer (53)--輸入會話spid,可查詢該會話正在執行的sql語句,從而知道發生死鎖的會話執行了什麼sql語句
SQL Server 中的死鎖
在兩個或多個任務中,如果每個任務鎖定了其他的任務試圖鎖定的資源,會造成這些任務永久阻塞,從而出現死鎖。此時系統處於死鎖狀態。死鎖的原因 在多使用者環境下,死鎖的發生是由於兩個事物都鎖定了不同的資源而又都在申請對方鎖定的資源,即一組程序中的各個程序均占有不會釋放的資源,但因相互申請其他程序占用的不會釋...
sqlserver死鎖阻塞
create proc p lockinfo kill lock spid bit 1,是否殺掉死鎖的程序,1 殺掉,0 僅顯示 show spid if nolock bit 1 如果沒有死鎖的程序,是否顯示正常程序資訊,1 顯示,0 不顯示 as declare count int,s nvar...
SQL Server清除死鎖
1 首先需要判斷是哪個使用者鎖住了哪張表.查詢被鎖表 select request session id spid,object name resource associated entity id tablenamefrom sys.dm tran locks where resource typ...