【问题标题】:Nested TransactionScope in Rebus EventhandlerRebus 事件处理程序中的嵌套 TransactionScope
【发布时间】:2015-05-26 10:29:10
【问题描述】:

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 的提升。

【问题讨论】:

    标签: .net transactionscope rebus


    【解决方案1】:

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

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

    不过,它可以启用 - 请查看 the updated wiki page 了解有关如何启用它的信息。

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

    【讨论】:

    • 谢谢。 :) 我不知道为什么它会帮助分成两个处理程序?如果我按照您更新的 Wiki 中的说明启用 TransactionScope,我假设 Rebus 仍然不使用 DTC?然后我仍然有写入数据库和弹出 MSMQ 不会发生在同一个事务中的问题。这意味着无论我是否将它们分成两个处理程序,写入都必须是 IdemPotent。我说的对吗?
    • 如果我使用您在更新的 wiki 页面上提到的 HandleMessagesInsideTransactionScope。 Rebus 会升级以使用 DTC 吗?如果不是,您是如何阻止这种情况发生的 :) 据我所知,当没有其他选项时,TransactionScope 会升级到 DTC。
    • 我猜它会升级,因为这就是那个愚蠢的事务范围的工作原理——但我相信一些巧妙的用法,例如new TransactionScope(TransactionScopeOptions.Suppress)(如果我没记错的话),可以让您创建另一个不会被列入 Rebus 的事务范围的事务范围....但是如果您不希望这样,为什么要在第一名?
    • 我确实希望它升级 - 虽然我喜欢你使用幂等性的想法,但我担心它在我们的情况下会太复杂。只是你在这里github.com/rebus-org/Rebus/wiki/Transactions 说 Rebus 不使用 DTC。所以我想知道你是否对 TransactionScope 应用了一些秘密魔法来阻止这种情况的发生,但你(幸运的是)没有。
    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2016-08-27
    • 2015-03-10
    相关资源
    最近更新 更多