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 被锁定的表名