相关疑难解决方法(0)

如何找到仍然持有锁的查询?

查询sys.dm_tran_locksDMV 会向我们显示哪些会话 (SPID) 持有表、页和行等资源的锁。

对于获取的每个锁,是否有任何方法可以确定导致该锁的 SQL 语句(删除、插入、更新或选择)?

我知道,most_recent_query_handle在列sys.dm_exec_connectionsDMV给了我们执行的最后一个查询的文本,而是多次其他查询同一个会话(SPID)在跑前和仍持有锁。

我已经使用了这个sp_whoisactive过程(来自 Adam Machanic),它只显示了此时输入缓冲区上的查询(想想DBCC INPUTBUFFER @spid),这并不总是(在我的情况下通常永远不会)是获取锁的查询。

例如:

  1. 打开交易/会话
  2. exec 语句(持有资源锁)
  3. 在同一个会话中执行另一个语句
  4. 打开另一个事务/会话并尝试修改在步骤 2 中锁定的资源。

sp_whoisactive过程将指出第 3 步中的语句,该语句不是锁的负责人,因此没有用。

这个问题来自使用Blocked Process Reports功能进行分析,以找出生产中阻塞场景的根本原因。每个事务运行多个查询,并且大多数时候最后一个(显示在 BPR 的输入缓冲区中)很少是持有锁的那个。

我有一个后续问题:有效识别阻塞查询的框架

sql-server locking blocking

16
推荐指数
2
解决办法
1万
查看次数

标签 统计

blocking ×1

locking ×1

sql-server ×1