我在调查一个我没有建立的过程。它使用service创建一个联系人队列,然后需要对它们执行一个操作。
然后有一个处理程序接收10k记录并将它们传递给存储过程以进行处理。
如果最终进程在没有错误处理的情况下死锁失败,会发生什么情况?这些会不会重新进入队列?如果没有,我需要做些什么才能让他们重新排队呢?
发布于 2016-07-21 19:42:40
可以从事务内访问Service队列。因此,如果您在代码中这样做(下面是伪代码;实际健壮的service代码有点超出了您的问题范围):
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将假设存在不可处理的消息并关闭队列。这真是糟糕的一天。
https://stackoverflow.com/questions/38506392
复制相似问题