Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NserviceBus发送后回滚_Nservicebus - Fatal编程技术网

NserviceBus发送后回滚

NserviceBus发送后回滚,nservicebus,Nservicebus,嗨,我有这个密码 SendMessageToMyQueue(); UpdateStatusInDbThatMessageWasSent(); 有时,在更新状态之前会对消息进行处理,我希望避免这种情况 我的问题是,如果我用这样一个事务来包装这两行: using(var tr = new TransactionScope()) { SendMessageToMyQueue(); UpdateStatusInDbThatMessageWasSent(); tr.Compleate(); }

嗨,我有这个密码

 SendMessageToMyQueue();
UpdateStatusInDbThatMessageWasSent();
有时,在更新状态之前会对消息进行处理,我希望避免这种情况

我的问题是,如果我用这样一个事务来包装这两行:

using(var tr = new TransactionScope())
{
  SendMessageToMyQueue();
UpdateStatusInDbThatMessageWasSent();
tr.Compleate();
}
将保证在创建的
MyQueue
上有一个锁,并且在
updateStatusIndbHatMessageWasSent
将更新状态之前不会释放该锁


另外,如果我添加了带有回滚的try-catch,并且更新状态失败,消息是否会从
MyQueue
中删除

队列上没有锁这样的东西。但是,如果满足以下条件,则将以事务方式处理消息。通过事务性,我的意思是,如果抛出未处理的异常,消息将返回到队列。实现这一目标的条件是:

  • 您的数据库可以登记并参与分布式事务。不是每个数据库都有。一些文档数据库不支持DTC(对于MongoDB)或sketchy(对于RavenDB)

  • 您的传输还支持分布式事务。如果使用代理类型的传输,SQL Server传输是最佳选择,而总线类型的传输MSMQ是一个不错的选择。Azure ServiceBus或RabbitMQ之类的传输对事务的支持非常有限,不支持分布式事务

  • 您需要运行已配置并正在运行的分布式事务协调器服务

还有两件事需要注意:

  • 如果您使用的传输缺少DTC支持,该怎么办?大多数情况下,如果你能将你的系统设计成这样,你会过得更好。NServiceBus的特性允许您在一定程度上模拟DTC

  • 当消息从队列中拾取、处理并由于异常返回到队列时,它可能最终位于队列中的其他位置。在设计基于消息的体系结构时,您需要这样做

综上所述,这一直是一个热门话题和争议