當前位置:首頁 » 編程語言 » sqlserver查死鎖的sql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlserver查死鎖的sql

發布時間: 2023-08-17 06:43:54

㈠ MSsqlSERVER中怎樣查詢引起死鎖的sql語句

當死鎖發生後,通過服務端的Trace就可以將死鎖信息傳到日誌。在SQL Server 2000時代,只能通過Trace flag 1204來開啟,由於Trace flag 1204並不能提供XML死鎖圖,在SQL Server 2005以及之後的版本被Trace flag 1222所取代。
為了在服務端針對所有的Session開啟Trace flag 1222。可以通過如代碼所示。
DBCC TRACEON(1222,-1)

另一種方法是開啟Profiler來捕捉,Profiler捕捉到的圖示死鎖信息內容就更直觀了,

㈡ sqlserver怎麼用sql查看具體那個表被鎖住了

查看被鎖表:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'

--spid 鎖表進程
--tableName 被鎖表名

解鎖:

declare @spid int
Set @spid = 57 --鎖表進程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)

--查詢出死鎖的SPID
select blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses where blocked>0 ) b
where a.blocked=spid)

--輸出引起死鎖的操作
DBCC INPUTBUFFER (@spid)
--查詢當前進程數

select count(-1) from sysprocesses
where dbid in (select dbid from sysdatabases where name like '%telcount%');

㈢ 如何查看SQL Server 2008的死鎖

為了查看死鎖信息,資料庫引擎提供了監視工具,分別為兩個跟蹤標志以及
SQL
Server
Profiler中的死鎖圖形事件。
跟蹤標志
1204
和跟蹤標志
1222
發生死鎖時,跟蹤標志
1204
和跟蹤標志
1222
會返回在
SQL
Server
錯誤日誌中捕獲的信息。跟蹤標志
1204
會報告由死鎖所涉及的每個節點設置格式的死鎖信息。跟蹤標志
1222
會設置死鎖信息的格式,順序為先按進程,然後按資源。可以同時啟用這兩個跟蹤標志,以獲取同一個死鎖事件的兩種表示形式。
SQL
Server
Profiler
中的
TraceEvent
Class:
LocksEvent
Name:
Deadlock
Graph
提供
一個XML
圖表.,你可以從中看出發生了什麼。

㈣ SQLServer死鎖的解除方法

SQL Server死鎖使我們經常遇到的問題 下面就為您介紹如何查詢SQL Server死鎖 希望對您學習SQL Server死鎖方面能有所幫助

SQL Server死鎖的查詢方法

exec master dbo p_lockinfo 顯示死鎖的進程 不顯示正常的進程

exec master dbo p_lockinfo 殺死死鎖的進程 不顯示正常的進程

SQL Server死鎖的解除方法

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 mastersysprocesses a join (

select blocked from mastersysprocesses 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 mastersysprocesses 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 mastersysprocesses

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 whereid=@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 whereid=@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

lishixin/Article/program/SQLServer/201311/22183

㈤ sql server中怎樣查詢引起死鎖的sql語句

DECLARE@spidINT
DECLARE@blkINT
DECLARE@countINT
DECLARE@indexINT
DECLARE@lockTINYINT

SET@lock=0

CREATETABLE#temp_who_lock
(
idINTIDENTITY(1,1),
spidINT,
blkINT
)

--if@@error<>0return@@error
INSERTINTO#temp_who_lock
(spid,
blk)
SELECT0,
blocked
FROM(SELECT*
FROMmaster..sysprocesses
WHEREblocked>0)a
WHERENOTEXISTS(SELECT*
FROMmaster..sysprocesses
WHEREa.blocked=spid
ANDblocked>0)
UNION
SELECTspid,
blocked
FROMmaster..sysprocesses
WHEREblocked>0

--if@@error<>0return@@error
SELECT@count=Count(*),
@index=1
FROM#temp_who_lock

--select@count,@index

--if@@error<>0return@@error
IF@count=0
BEGIN
SELECT'沒有阻塞和死鎖信息'
--return0
END

WHILE@index<=@count
BEGIN
IFEXISTS(SELECT1
FROM#temp_who_locka
WHEREid>@index
ANDEXISTS(SELECT1
FROM#temp_who_lock
WHEREid<=@index
ANDa.blk=spid))
BEGIN
SET@lock=1

SELECT@spid=spid,
@blk=blk
FROM#temp_who_lock
WHEREid=@index

SELECT'引起資料庫死鎖的是:'+Cast(@spidASVARCHAR(10))+'進程號,其執行的SQL語法如下';

SELECT@spid,
@blkDBCCinputbuffer(@spid)


DBCCinputbuffer(@blk)
END

SET@index=@index+1
END

IF@lock=0
BEGIN
SET@index=1

WHILE@index<=@count
BEGIN
SELECT@spid=spid,
@blk=blk
FROM#temp_who_lock
WHEREid=@index

IF@spid=0
SELECT'引起阻塞的是:'+Cast(@blkASVARCHAR(10))+'進程號,其執行的SQL語法如下'
ELSE
SELECT'進程號SPID:'+Cast(@spidASVARCHAR(10))+'被'+'進程號SPID:'+Cast(@blkASVARCHAR(10))+'阻塞,其當前進程執行的SQL語法如下'

PRINT(LTRIM(@spid)+''+LTRIM(@blk));
if(@spid<>0)
BEGIN
DBCCinputbuffer(@spid)--
END

DBCCinputbuffer(@blk)--引起阻塞語句

SET@index=@index+1
END
END

DROPTABLE#temp_who_lock

--return0
--KILL54

㈥ sqlServer查看死鎖及解鎖

--查看死鎖

select spid, blocked, loginame, last_batch, status, cmd, hostname, program_name 

from sysprocesses 

where spid in 

( select blocked from sysprocesses where blocked <> 0 ) or (blocked <>0) 

--解鎖

kill 進程號(spid)