【问题标题】:2 Phase Commit Global Transaction Status after 2nd Phase failure2 阶段失败后的 2 阶段提交全局事务状态
【发布时间】:2013-12-07 19:02:54
【问题描述】:

我的问题是这样的:

假设我有一个事务管理器和两个资源管理器。

  1. TM 告诉 RM 做好准备。
  2. 客户经理承认他们已准备好/投赞成票。
  3. TM 告诉 RM 提交。
  4. RM 1 提交并确认提交。
  5. RM 2 由于网络故障而从未收到提交消息。

在这种情况下,我知道 RM 2 处于等待状态,然后会话在数据库中超时并进入不确定状态。

如果在超过 AbandonTimeout 之前 TM 没有与 RM 重新连接,则该事务被放弃。

我的问题是,当 TM 继续尝试恢复 RM 时,全局事务会发生什么?

当 TM 开始尝试恢复时,它是否会向应用程序发回异常?

即使其中一个 RM 从未发送过确认,TM 是否会发回成功消息?

AbandonTimeout 默认为 24​​ 小时。 TM 是否将事务保留 24 小时,然后一旦达到超时,就发回异常?

在此链接2 phase Commit第二阶段结束状态:

  1. 协调器向所有群组发送提交消息。
  2. 每个队列完成操作,并释放事务期间持有的所有锁和资源。
  3. 每个群组都会向协调员发送确认消息。
  4. 协调器在收到所有确认后完成事务。

如果从未收到提交的确认,那么全局事务会发生什么?

在恢复操作期间,我找不到任何有关解决全局事务的信息。任何帮助将不胜感激。

谢谢, 马特

【问题讨论】:

    标签: jta xa 2phase-commit


    【解决方案1】:

    只有当所有参与者都返回ok时,事务才会作为提交返回到数据库。如果 TM 无法重新连接,它将一直处于不确定状态,可能会锁定数据库页面(这通常需要手动清理)。

    根据超时设置,客户端应用程序可能会收到错误。一些数据库系统(如 oracle)允许模拟不同的错误情况。以下链接描述了http://docs.oracle.com/cd/B28359_01/server.111/b28310/ds_txnman009.htm#ADMIN12285

    【讨论】:

    • 您的意思是事务将返回到应用程序(而不是数据库)作为提交?我也是这么想的。您碰巧不知道文档中的哪些地方会被涵盖?感谢您的回答!
    猜你喜欢
    • 2012-07-20
    • 2021-10-08
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2022-11-06
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    相关资源
    最近更新 更多