Sql Server 檢測死鎖的SQL語句

2022-02-06 19:17:51 字數 1850 閱讀 2204

首先建立乙個標量值函式diglock,用來遞迴檢測sqlserver中的每乙個會話是否存在加鎖迴圈,如果該函式最終返回1則表示檢測到了加鎖迴圈 (也就是說檢測到了死鎖),如果最終返回0則表示沒有檢測到加鎖迴圈。

1

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

然後定義乙個檢視v_deadlock_process,呼叫上面建立的函式,如果查詢出了結果說明當前sql server中存在死鎖

1

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)

查詢檢視v_deadlock_process,如果當前sql server中存在死鎖的話就會顯示查詢到了記錄

select

*from

[dbo

].[v_deadlock_process

]

上圖顯示,53號會話鎖住了54號會話,54號會話又鎖住了53號會話,所以當前sql server中存在死鎖。

然後可以使用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...