Rebus根据此不支持DTC:https://github.com/rebus-org/Rebus/wiki/Transactions但根据此https://github.com/rebus-org/Rebus/wiki/Automatic-retries-and-error-handling Rebus确实使用了TransactionScope。我想这意味着总是使用轻量级事务,它不能跨越多台机器或连接。
在我的情况下,我想要一个首先向Firebird写入内容的EventHandler,然后写入RavenDB。 Firebird和RavenDB都能够参与分布式事务。但它们在Rebus创建的TransactionScope中使用。
我是否必须在EventHandler for Firebird和RavenDB中通过DTC一起创建一个新的嵌套TransactionScope,其中包含“Require New”。或者我必须为Rebus进行DTC实现才能实现。
作为替代方案,我可能只需按照Rebus wiki的建议,每次写入IdemPotent。
我猜这个问题比Rebus更普遍。它实际上是关于TransactionScope的行为和促销到DTC的时候,有些连接允许它,有些则没有。
答案 0 :(得分:0)
我想你是对的,问题更多的是关于TransactionScope
如何工作,以及Firebird和RavenDB在环境事务中能够参与的程度。
Rebus不会(与发布此问题时wiki所说的相反)默认处理事务范围内的消息。
可以启用它 - 请查看the updated wiki page以获取有关如何启用它的信息。
我建议您使数据库更新具有幂等性,或者将写入拆分为由两个独立处理程序执行的两个单独步骤。