如何在SQL Server Service Broker RECEIVE中获取空结果集而不是等待事务结束



我想使用多个客户端处理service broker队列中的消息。他们的代码看起来是这样的:

select from queue
get @h = conversation_handle of message to process
begin transaction
receive message from queue where conversation_handle = @h
process message
commit transaction

(通过在消息成功处理之前不提交,我可以确保,如果进程死亡,那么它已经收到但尚未处理的消息不会从队列中删除。)

问题是当几个客户端同时尝试接收同一条消息时。第一个客户端接收并开始处理消息(需要很长时间),而其他客户端由于锁定而等待接收查询的结束。我希望客户端在锁定的情况下接收空行集,而不是等待事务结束。我尝试了WAITFOR(RECEIVE),TIMEOUT,但它不适合,仍然无限地等待事务结束。

receive message from queue where conversation_handle = @h

通过添加WHERE子句,可以强制执行块。你试图做的是一种反模式:让多个客户端共享一个队列等待,但每个客户端只对自己的消息感兴趣。这行不通,相信我,我见过很多人在尝试,但我还没有看到任何人成功。

如果必须让每个客户端只接收自己的消息,那么每个客户端都必须使用一个单独的队列(这意味着单独的服务)。与为多个客户端划分一个队列的问题(就像您现在尝试的那样)相比,为每个客户端部署队列/服务的问题微不足道。

最新更新