我有一个服务代理队列,其中一个对话没有被任何处理。但是当我跑步时它没有返回任何东西:
RECEIVE TOP(1000) * FROM dbo.QueueName
但是,如果我运行这个:
SELECT COUNT(*) FROM dbo.QueueName
我得到了成千上万的数字。这个数字也没有改变。我假设某些进程已锁定对话组但未对其执行任何操作。我如何判断是否是这种情况,如何判断哪个SPID有锁?
答案 0 :(得分:3)
如果您有权访问系统视图,sys.dm_os_waiting_tasks和sys.dm_tran_locks应该可以帮到您。前者是高水平的“我的过程在等什么”类型的东西。从那里,您可以获得阻止查询的SPID。从SPID列表中,您可以(如果您感兴趣的话)查询锁定视图以查看它们持有的锁定。顺便说一句,我发现数据库中的allow_snapshot_isolation或read_committed_snapshot之一在最近的一次约定中帮助了队列锁定。