對一個加鎖的表進(jìn)行解鎖
來源:程序員人生 發(fā)布時間:2014-03-06 12:03:11 閱讀次數(shù):3312次
點(diǎn)評use master 必須在master數(shù)據(jù)庫中創(chuàng)建 go if exists (select * from dbosysobjects where id = object_id(N[dbo][p_lockinfo]) and OBJECTPROPERTY(id NIsProcedure) = ) drop procedure [dbo][p_lockinfo] GO /*處理死鎖 查看當(dāng)前進(jìn)程或死鎖進(jìn)程并能自
use master
必須在master數(shù)據(jù)庫中創(chuàng)建
go
if exists (select * from dbo
sysobjects where id = object_id(N
[dbo]
[p_lockinfo]
) and OBJECTPROPERTY(id
N
IsProcedure
) =
)
drop procedure [dbo]
[p_lockinfo]
GO
/*
處理死鎖
查看當(dāng)前進(jìn)程
或死鎖進(jìn)程
并能自動殺掉死進(jìn)程
因?yàn)槭轻槍λ赖?fp class='fp-q1c0k'>所以如果有死鎖進(jìn)程
只能查看死鎖進(jìn)程
當(dāng)然
你可以通過參數(shù)控制
不管有沒有死鎖
都只查看死鎖進(jìn)程
感謝: caiyunxia
jiangopen 兩位提供的參考信息
鄒建
*/
/*
調(diào)用示例
exec p_lockinfo
*/
create proc p_lockinfo
@kill_lock_spid bit=
是否殺掉死鎖的進(jìn)程
殺掉
僅顯示
@show_spid_if_nolock bit=
如果沒有死鎖的進(jìn)程
是否顯示正常進(jìn)程信息
顯示
不顯示
as
declare @count int
@s nvarchar(
)
@i int
select id=identity(int
)
標(biāo)志
進(jìn)程ID=spid
線程ID=kpid
塊進(jìn)程ID=blocked
數(shù)據(jù)庫ID=dbid
數(shù)據(jù)庫名=db_name(dbid)
用戶ID=uid
用戶名=loginame
累計(jì)CPU時間=cpu
登陸時間=login_time
打開事務(wù)數(shù)=open_tran
進(jìn)程狀態(tài)=status
工作站名=hostname
應(yīng)用程序名=program_name
工作站進(jìn)程ID=hostprocess
域名=nt_domain
網(wǎng)卡地址=net_address
into #t from(
select 標(biāo)志=
死鎖的進(jìn)程
spid
kpid
a
blocked
dbid
uid
loginame
cpu
login_time
open_tran
status
hostname
program_name
hostprocess
nt_domain
net_address
s
=a
spid
s
=
from master
sysprocesses a join (
select blocked from master
sysprocesses group by blocked
)b on a
spid=b
blocked where a
blocked=
union all
select
|_犧牲品_>
spid
kpid
blocked
dbid
uid
loginame
cpu
login_time
open_tran
status
hostname
program_name
hostprocess
nt_domain
net_address
s
=blocked
s
=
from master
sysprocesses a where blocked<>
)a order by s
s
select @count=@@rowcount
@i=
if @count=
and @show_spid_if_nolock=
begin
insert #t
select 標(biāo)志=
正常的進(jìn)程
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>
begin
create table #t
(id int identity(
)
a nvarchar(
)
b Int
EventInfo nvarchar(
))
if @kill_lock_spid=
begin
declare @spid varchar(
)
@標(biāo)志 varchar(
)
while @i<=@count
begin
select @spid=進(jìn)程ID
@標(biāo)志=標(biāo)志 from #t where id=@i
insert #t
exec(
dbcc inputbuffer(
+@spid+
)
)
if @標(biāo)志=
死鎖的進(jìn)程
exec(
kill
+@spid)
set @i=@i+
end
end
else
while @i<=@count
begin
select @s=
dbcc inputbuffer(
+cast(進(jìn)程ID as varchar)+
)
from #t where id=@i
insert #t
exec(@s)
set @i=@i+
end
select a
*
進(jìn)程的SQL語句=b
EventInfo
from #t a join #t
b on a
id=b
id
end
go
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈