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