資料庫死鎖查詢

2021-09-11 01:56:37 字數 3719 閱讀 5427

檢視資料庫鎖:

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 procedure [dbo].[sp_who_lock]

asbegin

declare @spid int,@bl int,

@inttransactioncountonentry int,

@introwcount int,

@intcountproperties int,

@intcounter int

create table #tmp_lock_who (

id int identity(1,1),

spid smallint,

bl smallint)

if @@error<>0 return @@error

insert into #tmp_lock_who(spid,bl) select 0 ,blocked

from (select * from sys.sysprocesses where blocked>0)a

where not exists(select*from(select * from sys.sysprocesses where blocked>0)b

where a.blocked=spid)

union select spid,blocked from sys.sysprocesses where blocked>0

if @@error<>0 return @@error

--找到臨時表的記錄數

select @intcountproperties=count(*),@intcounter=1

from #tmp_lock_who

if @@error<>0 return @@error

if @intcountproperties=0

select'現在沒有阻塞和死鎖資訊'asmessage

--迴圈開始

while @intcounter<=@intcountproperties

begin

--取第一條記錄

select @spid=spid,@bl=bl

from #tmp_lock_who where id=@intcounter

begin

if @spid=0

select'引起資料庫死鎖的是:'+cast(@bl as varchar(10))+'程序號,其執行的sql語法如下'

else

select'程序號spid:'+cast(@spid as varchar(10))+'被'+'程序號spid:'+cast(@bl as varchar(10))+'阻塞,其當前程序執行的sql語法如下'

dbcc inputbuffer(@bl)

end--迴圈指標下移

set @intcounter=@intcounter+1

enddrop table #tmp_lock_who

return 0

end

關閉資料庫鎖:

重啟sql服務即可,亦可

use mastergo 

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[p_killspid]') and objectproperty(id, n'isprocedure') = 1)

drop procedure [dbo].[p_killspid]go

create proc p_killspid

@dbname varchar(200) --要關閉程序的資料庫名

as

declare @sql nvarchar(500)

declare @spid nvarchar(20)

declare #tb cursor for

select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)

open #tb

fetch next from #tb into @spid

while @@fetch_status=0

begin

exec('kill '+@spid)

fetch next from #tb into @spid

end

close #tb

deallocate #tbgo

--用法

exec p_killspid 'newdbpy'

另外,可以檢視鎖資訊:

–檢視鎖資訊

create table #t(req_spid int,obj_name sysname)

declare @s nvarchar(4000)

,@rid int,@dbname sysname,@id int,@objname sysname

declare tb cursor for

select distinct req_spid,dbname=db_name(rsc_dbid),rsc_objid

from master..syslockinfo where rsc_type in(4,5)

open tb

fetch next from tb into @rid,@dbname,@id

while @@fetch_status=0

begin

set @s='select @objname=name from ['+@dbname+']..sysobjects where id=@id'

exec sp_executesql @s,n'@objname sysname out,@id int',@objname out,@id

insert into #t values(@rid,@objname)

fetch next from tb into @rid,@dbname,@id

endclose tb

deallocate tb

select 程序id=a.req_spid

,資料庫=db_name(rsc_dbid)

,型別=case rsc_type when 1 then 'null 資源(未使用)'

when 2 then '資料庫'

when 3 then '檔案'

when 4 then '索引'

when 5 then '表'

when 6 then '頁'

when 7 then '鍵'

when 8 then '擴充套件盤區'

when 9 then 'rid(行 id)'

when 10 then '應用程式'

end,物件id=rsc_objid

,物件名=b.obj_name

,rsc_indid

from master..syslockinfo a left join #t b on a.req_spid=b.req_spid go

drop table #t

**出處

資料庫死鎖

1.死鎖的概念 死鎖是程序死鎖的簡稱,是由dijkstra於1965年研究銀行家演算法時首先提出來的。它是計算機作業系統乃至併發程式設計中最難處理的問題之一。實際上,死鎖問題不僅在計算機系統中存在,在我們日常生活中它也廣泛存在。我們先看看這樣乙個生活中的例子 在一條河上有一座橋,橋面較窄,只能容納一...

資料庫死鎖

資料庫在進行insert,update,delete這些更新操作的時候為了保證資料一致性都會使用排他鎖。乙個事務裡進行update操作,在事務結束之前 commit or rollback 排他鎖不會被釋放。因此在乙個事務裡update多條資料的時候執行順序就尤為重要,兩個併發事務中更新操作的執行順...

資料庫死鎖

死鎖 所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序 由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的...