如何找出Service Broker对话被锁定的内容?

时间:2011-12-09 11:45:52

标签: sql-server sql-server-2008-r2 service-broker

我有一个服务代理队列,其中一个对话没有被任何处理。但是当我跑步时它没有返回任何东西:

RECEIVE TOP(1000) * FROM dbo.QueueName

但是,如果我运行这个:

SELECT COUNT(*) FROM dbo.QueueName

我得到了成千上万的数字。这个数字也没有改变。我假设某些进程已锁定对话组但未对其执行任何操作。我如何判断是否是这种情况,如何判断哪个SPID有锁?

1 个答案:

答案 0 :(得分:3)

如果您有权访问系统视图,sys.dm_os_waiting_tasks和sys.dm_tran_locks应该可以帮到您。前者是高水平的“我的过程在等什么”类型的东西。从那里,您可以获得阻止查询的SPID。从SPID列表中,您可以(如果您感兴趣的话)查询锁定视图以查看它们持有的锁定。顺便说一句,我发现数据库中的allow_snapshot_isolation或read_committed_snapshot之一在最近的一次约定中帮助了队列锁定。