根据我的理解,NServiceBus在事务中执行IMessageHandler的Handle方法,如果异常传播出该方法,那么NServiceBus将确保消息被放回到消息队列中(在错误队列之前上升X次)等等。所以我们有一个原子操作可以这么说。
现在,如果我在NServiceBus Message 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()
}
这对交易范围有什么影响? 就其与Nservicebus交易的关系而言,trans1现在被视为嵌套交易,即使我们没有做任何事情来嫁给他们吗? (如果不是如何链接到NServiceBus的交易?
查看第二个块(trans2),如果我取消注释throw语句,那么NServiceBus事务是否也会回滚trans1?在基本场景中,假设我将上述内容转储到控制台应用程序中,则trans1是独立的,提交,刷新且不会回滚。我想澄清现在我们坐在别人的交易中会发生什么,比如NServiceBus?
以上只是示例代码,我不会直接使用会话,更像是通过uow模式。
答案 0 :(得分:7)
如果您将端点标记为事务(.MsmqTransport()。IsTransactional(true)或只是AsA_Server),那么事务将登记到打开的一个NServiceBus中。这意味着您在处理程序中提交的提交实际上不会发生,并且整个事件将一起提交或回滚 - 除非您明确告诉您的事务不要在环境事务中登记。
无论您是直接使用会话还是通过UoW工作,看起来您希望为给定的消息执行多个操作 - 为什么?消息已经是天然的UoW。