Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQLServerServiceBroker接收中获取空结果集而不是等待事务结束?_Sql Server_Service Broker - Fatal编程技术网

Sql server 如何在SQLServerServiceBroker接收中获取空结果集而不是等待事务结束?

Sql server 如何在SQLServerServiceBroker接收中获取空结果集而不是等待事务结束?,sql-server,service-broker,Sql Server,Service Broker,我想使用多个客户端处理ServiceBroker队列中的消息。他们的代码如下所示: 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 (通过在消息成功处理之前不提交,我可以确保,如果进程死

我想使用多个客户端处理ServiceBroker队列中的消息。他们的代码如下所示:

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子句,可以强制执行块。您试图做的是一种反模式:让多个客户端共享一个队列等待,但每个客户端只对自己的消息感兴趣。这是行不通的,相信我,我已经看到很多人在尝试,我还没有看到任何人成功

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

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

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

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

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

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


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

但是每个客户机都应该接收相同类型的消息。类似于可以由任何免费客户端处理的订单队列。如果任何消息都可以由任何客户端处理,那么为什么要添加WHERE子句?只需让客户端获取下一条可用消息,即任何消息。如果您有未在逻辑上连接的消息,则您不应该对其进行结构化,使其获得相同的会话句柄。但每个客户端都应该接收相同类型的消息。类似于可以由任何免费客户端处理的订单队列。如果任何消息都可以由任何客户端处理,那么为什么要添加WHERE子句?只需让客户端获取下一条可用消息,即任何消息。如果您有未在逻辑上连接的消息,则您不应该对其进行结构化,使其获得相同的会话句柄。但每个客户端都应该接收相同类型的消息。类似于可以由任何免费客户端处理的订单队列。如果任何消息都可以由任何客户端处理,那么为什么要添加WHERE子句?只需让客户端获取下一条可用消息,即任何消息。如果您有未在逻辑上连接的消息,则您不应该对其进行结构化,使其获得相同的会话句柄。但每个客户端都应该接收相同类型的消息。类似于可以由任何免费客户端处理的订单队列。如果任何消息都可以由任何客户端处理,那么为什么要添加WHERE子句?只要让客户机获得下一条可用消息,任何消息。如果您有未在逻辑上连接的消息,那么您不应该对其进行结构化,以使它们获得相同的会话句柄。