1、select * from sys.dm_tran_locks或sp_LOCK 查看request_node 字段中為'X'(排他鎖)或'IX'(意向排他鎖)
2、用sp_who2 + pid(進程ID) 查看進程的詳細信息
3、用dbcc inputbuffer(pid) 查看一起死鎖的語句內容
發生阻塞時,透過以下命令,可看出是哪個進程 session id,阻塞了哪幾個進程 session id,且期間經過了多少「毫秒 (ms)」。如下圖 3 里 session id = 53 阻塞了 session id = 52 的進程。另透過 SQL Server Profiler 工具,也能看到相同的內容。
SELECT blocking_session_id, wait_duration_ms, session_id FROM sys.dm_os_waiting_tasks
圖 3 本帖前述會話 A 的 UPDATE 語句 (53),阻塞了會話 B 的 SELECT 語句 (52)
透過以下兩個命令,我們還能看到整個數據庫的鎖定和阻塞詳細信息:
SELECT * FROM sys.dm_tran_locks
EXEC sp_lock
圖 4 session id = 52 的 process 因阻塞而一直處於等待中 (WAIT)
另透過 KILL 命令,可直接殺掉造成阻塞的 process,如下:
KILL 53
==================================================================
sp_lock–查詢哪個進程鎖表了,spid:進程ID,ObjId:對象ID
EXEC sp_executesql N'KILL [spid]'–殺進程
select object_name([ObjId])–查詢哪張表被鎖,找到其中的objId不為0的那個
– 使用sql語句進行查看 ,鎖定的表名
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
spid 鎖表進程
tableName 被鎖定的表名
===================================================================
轉自: https://blog.csdn.net/xiangbq/article/details/48031459