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

K M*_*ao 8 sql-server locking row

有没有办法列出锁定的表并杀死交易,如果我们希望它们立即解锁.

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

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

Mit*_*eat 13

这将显示所有具有独占锁定的数据库(可能包括在运行时保持的瞬态锁定),使用 sys.dm_tran_locksDMV:

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'
Run Code Online (Sandbox Code Playgroud)

(X =独占,S =共享,IS =意图共享)请参阅锁定模式.

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

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

参考:检测和结束死锁

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

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

dbcc inputbuffer (@pid)
Run Code Online (Sandbox Code Playgroud)

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

kill @pid
Run Code Online (Sandbox Code Playgroud)

看看谁是活跃的?v10.00:DMV监控变得简单

另外读取阻塞不是死锁(区分这两种情况)