【问题标题】:What if commit fails in XA?如果在 XA 中提交失败怎么办?
【发布时间】:2016-03-02 01:51:56
【问题描述】:

我指的是https://en.wikipedia.org/wiki/Two-phase_commit_protocol 的两阶段提交的描述。

在预提交阶段,假设两个资源经理都投了赞成票。

如果事务管理器通过向每个资源管理器发送 COMMIT 消息来启动提交,并且如果其中只有一个返回 ACK,而另一个没有,事务管理器如何从第一个资源管理器回滚已经提交的事务?提交成功了吗?

当全局事务失败时,是否有可能在一个资源管理器而不是另一个资源管理器上提交事务?

【问题讨论】:

    标签: distributed-transactions xa 2phase-commit


    【解决方案1】:

    是的,确实如此。

    在这种情况下,事务协调器通知所有成功提交事务的各方,他们必须回滚事务。

    这通常应该是由硬件故障或磁盘空间不足等问题引起的相对罕见的情况。在许多系统上,回滚涉及撤消从日志文件中读取的更改。

    这在您链接到的文章中也有解释。

    【讨论】:

    • Wiki 页面提到,可能需要手动步骤来修复失败的 XA 留下的问题。如果 XA 失败,是否应该采取一系列步骤?
    • 在我使用过的系统上,如果事务无法根据记录的日志信息回滚,则数据库会被标记为损坏(必须从备份中恢复),但这种情况极为罕见.
    【解决方案2】:

    我会说这取决于您使用的事务协调器的实现以及commit 产生的错误类型。 (我熟悉 Narayana 事务管理器。)

    关于您的第一个问题 - 如果事务参与者提交,那么事务协调器没有任何通用的方法来撤消它。如果 2PC 发生差异(一些参与者提交而其他参与者失败),则事务协调器会宣布启发式异常,并由管理员手动修复。是的,也许您需要使用一些内部数据库日志以防万一。

    但是 2PC 谈到了 2 个阶段,而第一个阶段在这里是相关的。如果所有参与者都从准备阶段返回 OK,则意味着所有参与者都在其内部事务日志中创建了一条记录。在数据库的情况下,当事务准备好并且某些行被锁定以更改其他事务时。 DB 然后等待协调器驱动提交。如果 DB 没有得到提交命令,它会等待 - 例如,如果从协调器到 DB 的连接中断,则等待连接再次启动。即使该事务协调器未能及时完成事务(因为连接崩溃),它也会(可能)在连接再次启动时完成其工作。

    现在取决于发生了什么故障。连接崩溃的例子被认为是一个临时的动作,事务协调器可以在连接建立后完成工作。如果有一些严重的问题,参与者会将有关它的信息返回给事务协调器,然后它会以上述启发式异常通知给用户。

    就是这样 - 以防一个参与者被提交,而另一个参与者如您的第二个问题所述被回滚。

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 2011-04-26
      • 1970-01-01
      • 2011-06-14
      • 2012-08-01
      • 1970-01-01
      • 2010-12-31
      • 2016-01-11
      • 2021-12-22
      相关资源
      最近更新 更多