【问题标题】:How can you find out what has a Service Broker conversation locked?如何找出 Service Broker 对话锁定的内容?
【发布时间】:2011-12-09 11:45:52
【问题描述】:
我有一个服务代理队列,其中有一个对话没有被任何东西处理。但是,当我运行时它没有返回任何内容:
RECEIVE TOP(1000) * FROM dbo.QueueName
但是如果我运行这个:
SELECT COUNT(*) FROM dbo.QueueName
我得到了成千上万的数字。这个数字也没有改变。我假设某个进程锁定了对话组,但没有对其进行任何操作。如何判断是否是这种情况以及如何判断哪个 SPID 拥有锁?
【问题讨论】:
标签:
sql-server
sql-server-2008-r2
service-broker
【解决方案1】:
如果您有权访问系统视图,则 sys.dm_os_waiting_tasks 和 sys.dm_tran_locks 应该可以将您带到您需要去的地方。前者是高级别的“我的进程在等待什么”类型的东西。从中,您可以了解哪些 SPID 正在阻止您的查询。从该 SPID 列表中,您可以(如果您有兴趣)查询锁视图以查看它们持有的锁。顺便说一句,我发现数据库上的 allow_snapshot_isolation 或 read_committed_snapshot 之一有助于在最近的参与中锁定队列。