SQL 服务器 Service Broker 死锁
SQL Server Service Broker Deadlock
我正在调查一个不是我构建的过程。它使用服务代理创建联系人队列,然后需要对他们执行操作。
然后有一个处理程序接收 10k 条记录并将它们传递给存储过程进行处理。
如果最终进程因没有错误处理的死锁而失败,会发生什么情况?这些会回到队列中吗?如果不是,我需要做什么才能让他们回到队列中?
可以从事务中访问服务代理队列。所以如果你在你的代码中做这样的事情(下面是伪代码;实际健壮的服务代理代码有点超出你的问题的范围):
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 将假定存在无法处理的消息并关闭队列。发生这种情况的那一天是糟糕的一天。
我正在调查一个不是我构建的过程。它使用服务代理创建联系人队列,然后需要对他们执行操作。
然后有一个处理程序接收 10k 条记录并将它们传递给存储过程进行处理。
如果最终进程因没有错误处理的死锁而失败,会发生什么情况?这些会回到队列中吗?如果不是,我需要做什么才能让他们回到队列中?
可以从事务中访问服务代理队列。所以如果你在你的代码中做这样的事情(下面是伪代码;实际健壮的服务代理代码有点超出你的问题的范围):
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 将假定存在无法处理的消息并关闭队列。发生这种情况的那一天是糟糕的一天。