据我了解,NServiceBus在事务内执行IMessageHandler的Handle方法。如果该方法中出现异常,则NServiceBus会确保将消息放回消息队列(最多重试X次,然后进入错误队列等待处理),这样我们就实现了原子操作。
现在,如果我在NServiceBus消息处理程序的Handle方法中执行以下操作:
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()
}
这对事务范围有何影响呢?即使我们没有进行任何操作,是否 trans1 现在也被视为与 Nservicebus 事务关系的嵌套事务?(如果不是,那么如何连接到 NServiceBus 事务?)
看看第二个块(trans2),如果我取消注释 throw 语句,那么 NServiceBus 事务会回滚 trans1 吗?在基本场景中,比如将上面的代码转储到控制台应用程序中,那么 trans1 是独立的,提交,刷新并且不会回滚。我想澄清一下现在当我们在别人的事务(如 NServiceBus)中时会发生什么?
上述只是示例代码,我不会直接使用 session,而是通过 uow 模式。