如果在工作单元的 End 方法中发生异常,是否有任何方法(除了注册分布式事务)来避免将 Saga 数据保存到 NServiceBus 中的 RavenDB?
我将 NSB 4.1 设置为不使用 DTC
NServiceBus.Configure.Transactions
.Enable()
.Advanced(action => action.DisableDistributedTransactions());
我有一个 SqlUnitOfWork,在提交对数据库的更改时可能会因为某些约束或超时或数据库中的某些意外而失败。
public class SqlUnitOfWork : IManageUnitsOfWork
{
...
public void End(Exception ex = null)
{
if (ex == null)
datacontext.SubmitChanges(); //this could throw an exception
}
}
当那里发生异常时,消息会重试,但 saga 已经保存到 ravendb。我发现的解决方法是不使用工作单元并在消息处理程序的 Handle 方法的末尾提交更改,但是当传输消息具有多个逻辑消息时,这不起作用。
有没有聪明的方法来做到这一点?