通過系統的儲存過程 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 列,主鎖型別了