MSSQL處理死鎖儲存過程

2021-06-20 18:24:17 字數 3014 閱讀 1736

sql server死鎖使我們經常遇到的問題,下面就為您介紹如何查詢

sql server

死鎖,希望對您學習sql server死鎖方面能有所幫助。

sql server死鎖的查詢方法:

exec master.dbo.p_lockinfo 0,0 ---顯示死鎖的程序,不顯示正常的程序  

exec master.dbo.p_lockinfo 1,0 ---殺死死鎖的程序,不顯示正常的程序 

sql server死鎖的解除方法:

create proc p_lockinfo  

@kill_lock_spid 

bit=

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

@show_spid_if_nolock 

bit=

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

as  

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=

0from 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

=1from master..sysprocesses a where blocked

<

>

0  )a order by s1,s2  

select @

count

=@@rowcount,@i=

1if @

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  

end  

if @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 

whereid

=@i  

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

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

set @

i=@i+1  

end  

end  

else  

while @i

<

=@count  

begin  

select @s=

'dbcc inputbuffer('

+cast(程序id as varchar)+')' from #t 

whereid

=@i  

insert #t1 exec(@s)  

set @

i=@i+1  

end  

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

from #t a join #t1 b on 

a.id=b

.id  

end  

mssql儲存過程異常處理

mssql2000和mssql2005以上版本的異常處理語法是不相同的。sql server 2005以上版本支援結構化異常處理,而mssql2000是不支援的。1 先看mssql 2000的異常處理語法 create proc sp mssql2000 titlename nvarchar 128...

SqlServer死鎖處理儲存過程

處理死鎖 檢視當前程序,或死鎖程序,並能自動殺掉死程序 因為是針對死的,所以如果有死鎖程序,只能檢視死鎖程序 當然,你可以通過引數控制,不管有沒有死鎖,都只檢視死鎖程序 鄒建 2004.4 呼叫示例 exec p lockinfo alter proc p lockinfo kill lock sp...

MSSQL儲存過程

sqlserver 帶有返回值,儲存過程同時新增兩張表,並將第一張表的主鍵插入第二張表當中 2010 07 04 22 00 55 分類 sql 字型大小 訂閱 sql server 中,可以使用 scope identity identity ident current 來取得最後插入記錄的值值,...