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