【问题标题】:Rollback in 2 phase commit两阶段提交中的回滚
【发布时间】:2014-12-02 14:51:51
【问题描述】:

我了解两阶段提交架构。让有 2 个奴隶和 1 个主人,所有准备阶段都很好。当 master 要求 slave 1 提交时,提交很好。当 master 要求 slave 2 提交时,它失败了。所以master现在需要回滚整个事务。我的问题是奴隶 1 现在将如何rollbakc,因为它已经提交了?据我所知,提交是完整的和最终的。磁盘上可能有保存点或日志来恢复状态,但这可能需要 DBA 协助。

对 SO 的参考 - Can a transaction be rolled back after it's committed and connection is closed?

【问题讨论】:

    标签: java transactions xa


    【解决方案1】:

    这通常是不可能的。两阶段提交的准备阶段应该做所有必要的事情来使事务持久,除了让它对其他人可见。成功完成准备后,提交应该始终是可能的。一旦两阶段提交被提交,它就不能被撤销。

    如果已经准备好的事务的提交失败(例如,因为资源暂时不可用),那么资源管理器应该能够恢复事务并重试提交。如果这是不可能的,那么资源不支持真正的两阶段提交并且可能是伪造的(例如通过忽略准备调用)。

    所以成功的提交不应该回滚,而失败的提交应该重试!

    【讨论】:

      【解决方案2】:

      2 阶段提交实际上意味着提交发生在 2 个阶段,而不是特别在两个数据端点上。从您的示例中,我得到的印象是您假设参与提交的 2 个从站意味着 2 个阶段。这是不正确的。提交的第一阶段(从属设备 1 响应为可行)实际上并没有被从属设备 1 向下传播。所以基本上当从属设备 1 在阶段 1 中说提交时,它更多的是它保存在内存中的备忘录副本。它实际上并没有在底层数据源上发出提交。当 Salve 2 说第一阶段回滚时,master 也会向 salve 1 发出回滚,这很容易做到,因为没有任何东西被持久化或向下游传播。

      但是,如果从站 2 也表示提交,则主站向两个从站发出第二阶段提交指令,以实际将提交操作向下游发送到它们的数据源。现在,此操作中的参与方可以是 2 个(如您的示例中)或更多。您可以在线阅读更多关于它的详细信息。只需 Google 即可获得 XA 交易和 2 阶段协议。简而言之,请记住,第一阶段更多的是软提交,每个参与的端点只是说“是否可以进行提交”,第二阶段是实际的硬提交。

      【讨论】:

      • 当系统真正支持两阶段提交时,prepare 使事务最终和持久(但其他人尚不可见)。那么它应该——除了系统故障——总是可以完成提交。
      • 马克是对的。在技​​术 ACID 术语中,第一阶段在完成时是持久的。从新手的角度来看,我会说它是一个软提交。
      猜你喜欢
      • 2016-09-01
      • 2011-11-15
      • 1970-01-01
      • 2011-11-24
      • 2013-05-21
      • 2015-02-02
      • 1970-01-01
      • 2012-06-27
      相关资源
      最近更新 更多