有没有办法列出锁定的表,如果我们希望它们立即解锁,就可以终止这些交易。
或者我正在寻找上述操作需要遵循的任何其他术语。
任何帮助或指导都将不胜感激。
答案 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(以区分这两种情况)