阻塞和死鎖問題整理:
--顯示資料庫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 列對應
usemaster
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) 偵測阻塞和阻塞查詢
如果乙個事務正在等待一些給其他事務鎖定的資源。這個事務就被成為 被阻塞的事務 反過來,引起阻塞的事務,也就是鎖定資源並造成其他事務等待的事務叫做 正在阻塞的事務 長時間執行事務會阻塞其他事務和查詢,使他們等待長時間。在繁重的系統中,很多時候我們會遇到阻塞問題,如果乙個事務因為阻塞未完成。會造成一些列...