Rebus 事件处理程序中的嵌套 TransactionScope
Nested TransactionScope in Rebus Eventhandler
Rebus 根据此不支持 DTC:https://github.com/rebus-org/Rebus/wiki/Transactions but according to this https://github.com/rebus-org/Rebus/wiki/Automatic-retries-and-error-handlingRebus 使用 TransactionScope。我想这意味着总是使用不能跨越多台机器或连接的轻量级事务。
在我的例子中,我想要一个 EventHandler,它首先向 Firebird 写入内容,然后写入 RavenDB。 Firebird 和 RavenDB 都能够参与分布式事务。但是它们在 Rebus 创建的 TransactionScope 中使用。
我是否必须在 EventHandler 中使用 "Require New" 创建一个新的嵌套 TransactionScope,以便 Firebird 和 RavenDB 通过 DTC 一起提交。或者我必须为 Rebus 做一个 DTC 实现才能工作。
作为替代方案,我可能只需要按照 Rebus wiki 中的建议使每次写入都是 IdemPotent。
我想这个问题比关于 Rebus 的问题更笼统。它实际上是关于 TransactionScope 的行为以及在某些连接允许而某些连接不允许时升级为 DTC。
我猜你是对的,问题更多是关于 TransactionScope
如何工作,以及 Firebird 和 RavenDB 能够在多大程度上参与环境事务。
默认情况下,Rebus 不会(与您发布此问题时 wiki 的声明相反)处理事务范围内的消息。
不过它可以启用 - 请查看 the updated wiki page 了解如何启用它的信息。
我建议您使数据库更新幂等,或者将写入分成两个单独的步骤,由两个单独的处理程序执行。
Rebus 根据此不支持 DTC:https://github.com/rebus-org/Rebus/wiki/Transactions but according to this https://github.com/rebus-org/Rebus/wiki/Automatic-retries-and-error-handlingRebus 使用 TransactionScope。我想这意味着总是使用不能跨越多台机器或连接的轻量级事务。
在我的例子中,我想要一个 EventHandler,它首先向 Firebird 写入内容,然后写入 RavenDB。 Firebird 和 RavenDB 都能够参与分布式事务。但是它们在 Rebus 创建的 TransactionScope 中使用。
我是否必须在 EventHandler 中使用 "Require New" 创建一个新的嵌套 TransactionScope,以便 Firebird 和 RavenDB 通过 DTC 一起提交。或者我必须为 Rebus 做一个 DTC 实现才能工作。
作为替代方案,我可能只需要按照 Rebus wiki 中的建议使每次写入都是 IdemPotent。
我想这个问题比关于 Rebus 的问题更笼统。它实际上是关于 TransactionScope 的行为以及在某些连接允许而某些连接不允许时升级为 DTC。
我猜你是对的,问题更多是关于 TransactionScope
如何工作,以及 Firebird 和 RavenDB 能够在多大程度上参与环境事务。
默认情况下,Rebus 不会(与您发布此问题时 wiki 的声明相反)处理事务范围内的消息。
不过它可以启用 - 请查看 the updated wiki page 了解如何启用它的信息。
我建议您使数据库更新幂等,或者将写入分成两个单独的步骤,由两个单独的处理程序执行。