查詢資料庫死鎖語句儲存過程

2021-10-14 18:52:14 字數 3210 閱讀 1698

use [master]

go/****** object:  storedprocedure [dbo].[p_lockinfo]    script date: 2016-11-23 16:29:01 ******/

set ansi_nulls on

goset quoted_identifier on

go/*--處理死鎖

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

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

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

呼叫示例

exec p_lockinfo 0,0

**/alter proc [dbo].[p_lockinfo]

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

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

asset nocount on

declare @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(255),b int,eventinfo nvarchar(1000))

if @kill_lock_spid=1

begin

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

while @i<=@count

begin

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

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

if @@rowcount=0 insert #t1(a) values(null)

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)

if @@rowcount=0 insert #t1(a) values(null)

set @i=@i+1

end-- select a.*,程序的sql語句=b.eventinfo

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

-- order by 程序id

if exists (select * from dbo.sysobjects where id = object_id(n'sys_lockinfo_log') and type = 'u')

begin

insert into sys_lockinfo_log

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

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

where (標誌='死鎖的程序' or 標誌= '|_犧牲品_>' )

order by 程序id

end 

else

begin

select a.*,程序的sql語句=b.eventinfo into sys_lockinfo_log

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

order by 程序id

endend

set nocount off

sqlserver查詢資料庫死鎖儲存過程 sql

use xx庫 go object storedprocedure dbo sp who lock script date 01 01 2014 14 52 27 set ansi nulls on goset quoted identifier on gocreate procedure dbo ...

資料庫語句之儲存過程

語句 create procedure 儲存過程名 預設值 output n with as sql語句 n 其中 output 該引數在儲存過程退出後,其值將返回至呼叫程式,以便在呼叫該儲存過程的程式中獲得並使用該引數值 recomple 建立的儲存過程在每次執行時都將被重新編譯 語句 exec ...

資料庫死鎖查詢

檢視資料庫鎖 use master go object storedprocedure dbo sp who lock script date 2019 2 18 11 17 50 set ansi nulls on goset quoted identifier on goalter proced...