为什么Service Broker接收的时间超过指定的超时?

时间:2011-10-18 12:39:11

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

我正在编写一个使用SQL Server Service Broker的高负载应用程序。我已经到了一个状态,即在我停止应用程序之后,在Management Studio中运行以下脚本需要1分6秒。可能导致它花了这么长时间?我以为TIMEOUT会在半秒后停止吗?

WAITFOR (RECEIVE TOP(1) * FROM [targetqueuename]), TIMEOUT 500;
SELECT @@ERROR;

@@ ERROR返回0.在第一次运行这个长时间后,子项运行会立即返回。

1 个答案:

答案 0 :(得分:3)

WAITFOR(RECEIVE), TIMEOUT通过实际运行RECEIVE至少一次来工作。如果结果集为空,则继续等待。每次它认为它可以成功(它在内部通知更多消息可用)它再次运行RECEIVE。在循环中重复,直到它返回行或它超时。

但超时不会中断已在此循环内执行的RECEIVE。如果RECEIVE花费很长时间来查找队列中的消息(可能发生大队列或RECEIVE的执行计划错误),则无法遵守超时。请注意,即使RECEIVE 找不到任何消息,情况也是如此,因为队列可能包含大量全部锁定的消息(更确切地说,所有消息都属于锁定的会话组)。在这种情况下,RECEIVE可能需要很长时间才能执行,搜索未锁定的会话组,最后仍然空手而归。