【问题标题】:SQL Server Service Broker DeadlockSQL Server 服务代理死锁
【发布时间】:2016-07-21 14:02:31
【问题描述】:

我正在调查一个不是我构建的流程。它使用服务代理创建一个联系人队列,然后需要对他们采取行动。

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

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

【问题讨论】:

  • 您是否尝试过使进程死锁并查看会发生什么?
  • 没有。不幸的是,我目前在实时服务器上。我希望有人会知道这是否有标准行为。我在搜索时看到了相互矛盾的报告,我想避免创建一个新流程来测试标准行为。也就是说,如果存在标准行为。
  • 如果这一切都在事务中,那么它就会回滚。如果没有,那么你有:peek - 完成,process - 失败。作为单独的交易。

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


【解决方案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 将假定存在无法处理的消息并关闭队列。发生这种情况的日子不好过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    相关资源
    最近更新 更多