SQLServer檢視和解決死鎖的方法

2022-07-13 10:22:15 字數 2470 閱讀 3381

在master資料庫中新建以下儲存過程

--處理死鎖

-- 檢視當前程序,或死鎖程序,並能自動殺掉死程序

-- 因為是針對死的,所以如果有死鎖程序,只能檢視死鎖程序

-- 當然,你可以通過引數控制,不管有沒有死鎖,都只檢視死鎖程序

--呼叫示例 exec p_lockinfo

create proc [dbo].[p_lockinfo]

@kill_lock_spid bit=1, --是否殺掉死鎖的程序,1 殺掉, 0 僅顯示

@show_spid_if_nolock bit=1 --如果沒有死鎖的程序,是否顯示正常程序資訊,1 顯示,0 不顯示

asdeclare @count int,@s nvarchar(1000),@i int

select id=identity(int,1,1),標誌,

程序id=spid,執行緒id=kpid,塊程序id=blocked,資料庫id=dbid,

資料庫名=db_name(dbid),使用者id=uid,使用者名稱=loginame,累計cpu時間=cpu,

登陸時間=login_time,開啟事務數=open_tran, 程序狀態=status,

工作站名=hostname,應用程式名=program_name,工作站程序id=hostprocess,

網域名稱=nt_domain,網絡卡位址=net_address

into #t from(

select 標誌='死鎖的程序',

spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,

status,hostname,program_name,hostprocess,nt_domain,net_address,

s1=a.spid,s2=0

from master..sysprocesses a join (

select blocked from master..sysprocesses group by blocked

)b on a.spid=b.blocked where a.blocked=0

union all

select '|_犧牲品_>',

spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,

status,hostname,program_name,hostprocess,nt_domain,net_address,

s1=blocked,s2=1

from master..sysprocesses a where blocked<>0

)a order by s1,s2

select @count=@@rowcount,@i=1

if @count=0 and @show_spid_if_nolock=1

begin

insert #t

select 標誌='正常的程序',

spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,

open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address

from master..sysprocesses

set @count=@@rowcount

endif @count>0

begin

create table #t1(id int identity(1,1),a nvarchar(30),b int,eventinfo nvarchar(255))

if @kill_lock_spid=1

begin

declare @spid varchar(10),@標誌 varchar(10)

while @i<=@count

begin

select @spid=程序id,@標誌=標誌 from #t where id=@i

insert #t1 exec('dbcc inputbuffer('+@spid+')')

if @標誌='死鎖的程序' exec('kill '+@spid)

set @i=@i+1

endend

else

while @i<=@count

begin

select @s='dbcc inputbuffer('+cast(程序id as varchar)+')' from #t where id=@i

insert #t1 exec(@s)

set @i=@i+1

endselect a.*,程序的sql語句=b.eventinfo

from #t a join #t1 b on a.id=b.id

endgo

在sql查詢視窗中執行以下儲存過程

exec p_lockinfo 1,1

摘自:

查詢死鎖 和 解決死鎖

sql中執行 sp who lock kill 1 1 語句中查詢出來的id set ansi nulls on go set quoted identifier on go alter procedure dbo sp who lock as begin declare spid int decl...

檢視事務鎖,解決死鎖

第一步,查出已鎖的程序 檢視正在鎖的事務 select from information schema.innodb locks 檢視等待鎖的事務 select from information schema.innodb lock waits innodb trx表主要是包含了正在innodb引擎...

SQL Server 2005中解決死鎖問題

資料庫操作的死鎖是不可避免的,本文並不打算討論死鎖如何產生,重點在於解決死鎖,通過sql server 2005,現在似乎有了一種新的解決辦法。將下面的sql語句放在兩個不同的連線裡面,並且在5秒內同時執行,將會發生死鎖。use northwind begin tran insert into or...