如何在NServiceBus中回滚NHibernate事务

时间:2011-06-08 18:52:02

标签: nhibernate transactions nservicebus

我的理解是,在使用NServiceBus时,我们基本上有两种例外。

环境:意味着目前无法获得任何所需组件。通常导致事务的完全回滚。这是我在NServiceBus文档中回滚后面看到的描述(包括将消息放回总线 - 这听起来很棒)。我该怎么做?

验证:正在处理的消息由于业务逻辑,规则等而无法成功处理。我想要回滚所有数据库交互,但是将命令保留在队列中没有任何价值。在这种情况下,我只想回滚事务的NHibernate部分 - 而不是MSMQ部分。我该怎么做呢?通常我会在处理任何单个消息之前执行验证,但是当您将多个消息绑定到一个事务中并且您想要将它们全部回滚时,这是不可能通过预验证进行的。

我的假设是答案是非常明显的,我忽略了它或者我想要做的事情是不可能的(关于验证例外)。

3 个答案:

答案 0 :(得分:1)

NSB通过将消息移动到错误队列(v2.5)来处理消息。在v3中,此功能得到了增强,并为您提供了更多处理故障的选项(数据库,自定义等)。错误队列在app.config中配置。

答案 1 :(得分:1)

根据我的经验,最简单(也可能更合适)确保消息在参与分布式事务时成功的可能性非常高。

因此,在发送命令消息时,应该已经执行了大多数验证逻辑,并且为真正特殊情况保留了回滚。

如果您的客户端无法执行验证,您可能应该在当前服务之前插入验证服务。此验证服务可以在无效命令消息到达实际服务之前将其路由到其他位置。

答案 2 :(得分:1)

感谢您的回答。我相信答案就在两者之间。

遗憾的是,我们无法实现验证服务,但我们只是在消息处理逻辑中添加了更好的前期验证。

不幸的是,在我们进入v3之前,我们目前无法使用错误队列,因为我们正在利用消息响应功能向集成商提醒他们的消息问题。并且抛出未处理的错误会阻止生成任何响应。