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