NServiceBus和NHibernate - 消息处理程序和事务

9

据我了解,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 模式。
1个回答

7
如果您将终结点标记为事务(.MsmqTransport().IsTransactional(true)或仅AsA_Server),那么事务将加入NServiceBus打开的事务。这意味着您在处理程序中拥有的提交实际上不会发生,整个事务将一起提交或回滚 - 除非您明确告诉事务不要加入环境事务。
无论您是直接使用会话还是通过UoW工作,看起来您想为给定消息做多个操作 - 为什么?该消息已经是自然的UoW。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接