如何查找被锁定的表名(特定于任何事务)

时间:2010-12-16 09:26:28

标签: sql-server locking row

有没有办法列出锁定的表,如果我们希望它们立即解锁,就可以终止这些交易。

或者我正在寻找上述操作需要遵循的任何其他术语。

任何帮助或指导都将不胜感激。

1 个答案:

答案 0 :(得分:13)

这将使用sys.dm_tran_locks DMV显示所有持有排他锁的数据库(可能包括在运行时保留的瞬态锁):

select d.*, l.* from sys.dm_tran_locks l
join sys.databases d on l.resource_database_id = d.database_id 
where l.request_mode = 'X'

(X =独占,S =共享,IS =意图共享)请参阅Lock Modes

但最好的办法是打开Trace Flags 1204和1222:

  

跟踪标志1204和跟踪标志1222   当发生死锁时,跟踪标志1204   和跟踪标志1222返回信息   在SQL Server中捕获的   2005年错误日志。跟踪标志1204   报告格式化的死锁信息   由死锁中涉及的每个节点组成。   跟踪标志1222格式化死锁   信息,首先是流程和   然后是资源。有可能   启用两个跟踪标志以获得两个   同一死锁的表示   事件

参考:Detecting and Ending Deadlocks

此外,运行sp_who2并查找BlkBy(已阻止)列中的条目;按照这些,直到你到达僵局链的头部。这是负责的进程标识符(或PID)。

要获取在特定进程后面运行的sql,您可以运行:

dbcc inputbuffer (@pid)

并使用该PID来杀死进程(谨慎且风险自负):

kill @pid

查看Who is Active? v10.00: DMV Monitoring Made Easy

同时阅读Blocking is not Deadlocking(以区分这两种情况)