關於SQLServer死鎖的診斷和定位

2021-09-04 18:30:18 字數 2631 閱讀 1439

關於 sqlserver 死鎖的診斷和定位

在 sqlserver 中經常會發生死鎖情況,必須連線到企業管理 器— > 管理— > 當前活動— > 鎖 / 程序 id 去查詢相關死鎖程序和定位死鎖的原因。

通過查詢分析器也要經過多個系統表 (sysprocesses,sysobjects 等 ) 和系統儲存過程 (sp_who,sp_who2,sp_lock 等 ) ,而且不一定能夠直接定位到。

create procedure sp_check_deadlock            

as set nocount on

/* select

spid    被鎖程序 id,

blocked 鎖程序 id,

status  被鎖狀態 ,

substring(suser_sname(sid),1,30) 被鎖程序登陸帳號 ,

substring(hostname,1,12)         被鎖程序使用者機器名稱 ,

substring(db_name(dbid),1,10)    被鎖程序資料名稱 ,

cmd 被鎖程序命令 ,

waittype 被鎖程序等待型別

from master..sysprocesses

where blocked>0

--dbcc inputbuffer(66) 輸出相關鎖程序的語句

-- 建立鎖程序臨時表

create table #templocktracestatus ( 

eventtype varchar(100),

parameters int,

eventinfo varchar(200)

) (

-- 建立被鎖程序臨時表

create table #tempbelocktracestatus (

eventtype varchar(100),

parameters int,  eventinfo varchar(200) )

-- 建立之間的關聯表

create table #locktracestatus (

belockspid int,

belockspidremark varchar(20),

belockeventtype varchar(100),

belockeventinfo varchar(200),

lockspid int

lockspidremark  varchar(20)

lockeventtype   varchar(100)

lockeventinfo   varchar(200) )

-- 獲取死鎖程序

declare dbcc_inputbuffer cursor read_only

for select spid 被鎖程序 id,blocked 鎖程序 id

from master..sysprocesses

where blocked>0

declare @lockedspid int          declare @belockedspid int

open dbcc_inputbuffer

fetch next from dbcc_inputbuffer into @belockedspid,@lockedspid

while (@@fetch_status <> -1)

begin

if (@@fetch_status <> -2)

begin

--print ' 被堵塞程序 

--select @belockedspid

--dbcc inputbuffer(@belockedspid

--print ' 堵塞程序         --select @lockedspid

--dbcc inputbuffer(@lockedspid)

insert into #tempbelocktracestatus

exec('dbcc inputbuffer(

'+@belockedspid+')')

insert into #templocktracestatus

5b4eq*y0gpc6517           exec('dbcc inputbuffer(

'+@lockedspid+')') 

insert into #locktracestatus

select @belockedspid,' 被鎖程序 ',a.eventtype,a.eventinfo,@lockedspid,' 鎖程序 

from #tempbelocktracestatus a,#templocktracestatus b

end

fetch next from dbcc_inputbuffer into @belockedspid,@lockedspid

end

close dbcc_inputbuffer

deallocate dbcc_inputbuffer

select * from #locktracestatus

return (0) -- sp_check_deadlock

執行該儲存過程

exec sp_check_deadlock

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...