SQL Server Service Broker Deadlock



我正在调查一个我没有构建的进程。它使用service broker创建一个联系人队列,然后需要对其执行操作。

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

如果最后一个进程由于没有错误处理的死锁而失败,会发生什么?这些会重新排队吗?如果没有,我需要做什么才能让他们重新排队?

可以从事务中访问Service broker队列。因此,如果你在代码中做了这样的事情(下面是伪代码;实际健壮的service broker代码有点超出了你的问题范围):

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会认为存在不可处理的消息,并关闭队列。当这种情况发生时,那是糟糕的一天。

最新更新