阻塞和死鎖問題整理一

2021-09-08 16:40:32 字數 3759 閱讀 4289

阻塞和死鎖問題整理:

--

顯示資料庫test的鎖資訊sp: sp_lock

--獲取使用者資訊: sp_who or sp_who2

select

*from sys.sysprocesses as sps with

(nolock)

--or

select

sps.spid, sps.kpid , sps.blocked , sps.waittime ,

sps.cpu, sps.physical_io,sps.loginame ,sps.hostname ,

sps.program_name ,sps.open_tran , sps. status ,

sps.sql_handle ,sps.login_time, sps.last_batch

from sys.sysprocesses as sps with(nolock)

然後用 :dbcc inputbuffer(spid) 來進行操作查詢出對應的查詢或者儲存過程

也可以用:select * from sysprocesses with(nolock)

where spid > 50

確定了使用者的查詢對應的是 sysprocesses 的那一條記錄,對於長時間執行的查詢,應該看它的狀態 status 列 :

如果是running 一般是ok的,通過 lastwaittype 列可以看到它在操作什麼資源

對於 running狀態的,多資料是io

如果狀態是 susppend ,那就比較麻煩,通過 waitresource 可以去了解是什麼資源沒有分配到,導致它這個狀態

如果 blocked 列 > 0的話, 這個blocked 列對應

use

master

go--

create procedure sys.sp_lock --- 1996/04/08 00:00

--@spid1 int = null, /* server process id to check for locks */

--@spid2 int = null /* other process id to check for locks */

--as

set nocount on

/*** show the locks for both parameters.

*/set

transaction

isolation

level

read

committed

if@spid1

isnot

null

begin

select

convert (smallint, req_spid) as

spid,

rsc_dbid

asdbid,

rsc_objid

asobjid,

rsc_indid

asindid,

substring (v.name, 1, 4) as

type,

substring (rsc_text, 1, 32) as

resource,

substring (u.name, 1, 8) as

mode,

substring (x.name, 1, 5) as

status

from

master.dbo.syslockinfo,

master.dbo.spt_values v,

master.dbo.spt_values x,

master.dbo.spt_values u

where master.dbo.syslockinfo.rsc_type = v.number

and v.type ='lr

'and master.dbo.syslockinfo.req_status = x.number

and x.type ='ls

'and master.dbo.syslockinfo.req_mode +

1= u.number

and u.type ='l

'and req_spid in (@spid1, @spid2

) end

/*** no parameters, so show all the locks.

*/else

begin

select

convert (smallint, req_spid) as

spid,

rsc_dbid

asdbid,

rsc_objid

asobjid,

rsc_indid

asindid,

substring (v.name, 1, 4) as

type,

substring (rsc_text, 1, 32) as

resource,

substring (u.name, 1, 8) as

mode,

substring (x.name, 1, 5) as

status

from

master.dbo.syslockinfo,

master.dbo.spt_values v,

master.dbo.spt_values x,

master.dbo.spt_values u

where master.dbo.syslockinfo.rsc_type = v.number

and v.type ='lr

'and master.dbo.syslockinfo.req_status = x.number

and x.type ='ls

'and master.dbo.syslockinfo.req_mode +

1= u.number

and u.type ='l

'order

byspid

endreturn (0) --

sp_lock

的是阻塞當前查詢的進行,你可以去了解這個程序是在做什麼

如果 blocked 列 = 0的話,那應該分析一下 waitresource ,看看是在等待什麼資源。

第一步要做的就是定位他們的查詢是那條記錄,如果這個檢查的過程很慢,應該觀賽伺服器是否響應有問題。比如:cpu 是否過高,連線數是否過多(count sysprocesses 的結果)

執行語句是什麼,sysprocess 的 stmt_start, stmt_end 列標了在 fn_get_sql 中, 當前執行的語句的位置連線資料(通常超過700就會響應異常(不管狀態)),好的伺服器可能會更多一些,差的伺服器可能會更少一些

--刪除鎖

kill

-- 利用: exec sp_helptext  'name'  可以檢視函式、儲存過程、檢視的原始碼

--eg:

exec sp_helptext  sp_who2

--獲取資料庫相關資訊

select * from sysdatabases

--返回物件資訊

select object_name(objid)

--包含有關所有已授權、正在轉換和正在等待的鎖請求的資訊

sys.dm_tran_locks 能夠返回系統中當前活動的鎖管理器資訊

附乙個 sp_lock的原始碼

阻塞和死鎖

阻塞和死鎖是兩個不同的概念。舉個例子,現在有執行緒1和執行緒2,執行緒1占用了資源a,執行緒2占用了資源b。此時執行緒2需要使用資源a才能繼續,但是資源a被執行緒1所占用,那麼執行緒2只能等待資源a被執行緒1釋放掉,這種情況稱為執行緒2被阻塞。但是,如果此時執行緒1也許要資源b才能繼續,那麼兩個執行...

SQL Server的阻塞 死鎖問題

通過 sysprocesses 簡單查詢死鎖及解決死鎖辦法 簡單查詢死鎖,如下四步可以輕鬆解決 第一步 查詢死鎖語句 1 條件是 blocked 0 select dbid,from sys.sysprocesses where 1 1 and spid 50 and blocked 0 and s...

處理鎖 阻塞和死鎖(2) 偵測阻塞和阻塞查詢

如果乙個事務正在等待一些給其他事務鎖定的資源。這個事務就被成為 被阻塞的事務 反過來,引起阻塞的事務,也就是鎖定資源並造成其他事務等待的事務叫做 正在阻塞的事務 長時間執行事務會阻塞其他事務和查詢,使他們等待長時間。在繁重的系統中,很多時候我們會遇到阻塞問題,如果乙個事務因為阻塞未完成。會造成一些列...