SQL SERVER 查詢鎖資訊

匡匡發表於2018-01-05

通過系統的儲存過程  sp_who 或 sp_who2 可以查詢出所有的鎖資訊, 但是看不出是哪個表, 什麼語句

 

當使用 sp_who 或 sp_who2 查詢鎖資訊的時候, 有個 spid 資訊, 可以通過下面的語句查出相應的語句

DBCC INPUTBUFFER (spid)

使用這個語句, 不一定能查出資訊, 能查出來, 就是執行的語句, 也有說這個是查死鎖語句的。

 

下面語句查死鎖數

select 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)

 

 

使用下面的語句, 可以查詢出哪些表被鎖,以及被鎖的次數

select tablename, COUNT(*) CNT from (
	select   request_session_id   spid,OBJECT_NAME(resource_associated_entity_id) tableName   
	from   sys.dm_tran_locks where resource_type='OBJECT'
) aa group by tableName
order by CNT desc

 

有時候需要知道在更新或刪除時,鎖的是行、頁或表等,可以通過下面的方式來檢查

-- 先開啟一個事務
BEGIN   TRAN 

-- 執行 UPDATE 或 DELETE
update TABLE_NAME set F1='123'
where ID = '1'

--   列出鎖資訊 
EXEC   sp_lock   @@spid 

-- 最後 COMMIT 或 ROLLBACK 事務
ROLLBACK   TRAN

在這個執行過程中,可以通過 sp_lock 顯示當前的連線的鎖, 在列出的列表中, 有一 Type 列,主鎖型別了

相關文章