SQL Server Service Broker死锁

时间:2016-07-21 14:02:31

标签: sql sql-server tsql message-queue service-broker

我正在研究一个我没有建立的过程。它使用服务代理创建一个联系人队列,然后需要针对他们采取行动。

然后有一个处理程序接收10k记录并将它们传递给存储过程进行处理。

如果最终进程因没有错误处理的死锁而失败,会发生什么?这些会重新进入队列吗?如果不是我需要做什么才能让他们回到队列中?

1 个答案:

答案 0 :(得分:1)

可以在事务中访问服务代理队列。所以如果你在你的代码中做了类似的事情(下面是伪代码;实际强大的服务代理代码有点超出了你的问题的范围):

begin tran
   receive top(10000) message_body
   into @table
   from dbo.yourQueue;

   while(1=1)
   begin
      select top(1) @message = message
      from @table;
      if (@message is null)
         break;
      exec dbo.processMessage @message;
   end
commit tran

...然后你就定了。我所说的是,只要您在同一事务中执行receive并处理,任何故障(包括死锁)都将回滚事务并将消息放回队列中。但请确保您已阅读有毒邮件处理!如果回滚太多,SQL将假定存在不可处理的消息并关闭队列。那是发生这种情况的糟糕日子。