据我了解,NServiceBus 在事务中执行 IMessageHandler 的 Handle 方法,如果异常传播出此方法,则 NServiceBus 将确保将消息放回消息队列(在错误队列之前最多 X 次)等。所以我们有一个原子操作可以这么说。
现在,如果我在我的 NServiceBus 消息句柄方法中做这样的事情
using(var trans = session.BeginTransaction())
{
person.Age = 10;
session.Update<Person>(person);
trans.Commit()
}
using(var trans2 = session.BeginTransaction())
{
person.Age = 20;
session.Update<Person>(person);
// throw new ApplicationException("Oh no");
trans2.Commit()
}
这对交易范围有什么影响?就其与 Nservicebus 事务的关系而言,trans1 现在是否算作嵌套事务,即使我们没有做任何事情来将它们结合起来?(如果不是,如何链接到 NServiceBus 的事务?
查看第二个块(trans2),如果我取消注释 throw 语句,NServiceBus 事务是否也会回滚 trans1?在基本场景中,假设我将上述内容转储到控制台应用程序中,然后 trans1 是独立的、提交、刷新并且不会回滚。我试图澄清现在我们坐在别人的交易中会发生什么,比如 NServiceBus?
以上只是示例代码,我不会直接使用会话,更像是通过 uow 模式。