2

根据此,Rebus 不支持 DTC:https ://github.com/rebus-org/Rebus/wiki/Transactions但根据此 https://github.com/rebus-org/Rebus/wiki/Automatic-retries- and-error-handling Rebus 确实使用了 TransactionScope。我想这意味着总是使用不能跨越多台机器或连接的轻量级事务。

就我而言,我想要一个 EventHandler,它首先向 Firebird 写入内容,然后写入 RavenDB。Firebird 和 RavenDB 都能够参与分布式事务。但它们在 Rebus 创建的 TransactionScope 中使用。

我是否必须在 EventHandler 中创建一个带有“Require New”的新嵌套 TransactionScope,以便 Firebird 和 RavenDB 通过 DTC 一起提交。或者我是否必须为 Rebus 执行 DTC 才能使其正常工作。

作为替代方案,我可能只需要按照 Rebus wiki 中的建议进行每次写入 IdemPotent。

我想这个问题比 Rebus 更笼统。当某些连接允许而某些连接不允许时,这实际上是关于 TransactionScope 的行为和对 DTC 的提升。

4

1 回答 1

0

我想你是对的,问题更多是关于如何TransactionScope工作,以及 Firebird 和 RavenDB 能够在多大程度上参与环境事务。

默认情况下,Rebus 不会(与您发布此问题时 wiki 所说的相反)处理事务范围内的消息。

不过,它可以启用 - 请查看更新的 wiki 页面以获取有关如何启用它的信息。

我建议您要么使数据库更新具有幂等性,要么将写入拆分为由两个单独的处理程序执行的两个单独的步骤。

于 2015-05-26T13:53:47.527 回答