9

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

4

1 回答 1

7

如果您将端点标记为事务(.MsmqTransport().IsTransactional(true) 或只是 AsA_Server),则事务将登记到打开的 NServiceBus 中。这意味着您在处理程序中的提交实际上不会发生,整个事情将一起提交或回滚 - 除非您明确告诉您的事务不要加入环境事务。

无论您是直接使用会话还是通过 UoW 工作,看起来您想要为给定的消息做不止一个 - 为什么?该消息已经是自然的 UoW。

于 2009-10-17T14:18:02.770 回答