對一個加鎖的表進行解鎖
來源:程序員人生 發布時間:2014-03-06 12:03:11 閱讀次數:3319次
點評use master 必須在master數據庫中創建 go if exists (select * from dbosysobjects where id = object_id(N[dbo][p_lockinfo]) and OBJECTPROPERTY(id NIsProcedure) = ) drop procedure [dbo][p_lockinfo] GO /*處理死鎖 查看當前進程或死鎖進程并能自
use master
必須在master數據庫中創建
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
/*
處理死鎖
查看當前進程
或死鎖進程
并能自動殺掉死進程
因為是針對死的
所以如果有死鎖進程
只能查看死鎖進程
當然
你可以通過參數控制
不管有沒有死鎖
都只查看死鎖進程
感謝: caiyunxia
jiangopen 兩位提供的參考信息
鄒建
*/
/*
調用示例
exec p_lockinfo
*/
create proc p_lockinfo
@kill_lock_spid bit=
是否殺掉死鎖的進程
殺掉
僅顯示
@show_spid_if_nolock bit=
如果沒有死鎖的進程
是否顯示正常進程信息
顯示
不顯示
as
declare @count int
@s nvarchar(
)
@i int
select id=identity(int
)
標志
進程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
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 標志=
正常的進程
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(
)
@標志 varchar(
)
while @i<=@count
begin
select @spid=進程ID
@標志=標志 from #t where id=@i
insert #t
exec(
dbcc inputbuffer(
+@spid+
)
)
if @標志=
死鎖的進程
exec(
kill
+@spid)
set @i=@i+
end
end
else
while @i<=@count
begin
select @s=
dbcc inputbuffer(
+cast(進程ID as varchar)+
)
from #t where id=@i
insert #t
exec(@s)
set @i=@i+
end
select a
*
進程的SQL語句=b
EventInfo
from #t a join #t
b on a
id=b
id
end
go
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈