在MySQL中恢复分布式事务

文章介绍了分布式事务处理中的两阶段提交(2PC)机制,以及在MySQL中使用XA事务时遇到的问题,如PREPARED状态的事务持久化。作者详细描述了解决这类问题的方法,包括XARECOVER和XACOMMIT/XAROLLBACK命令的使用。
摘要由CSDN通过智能技术生成

分布式事务(也称为 XA 事务)的出现是为了解决分布式环境中跨多个数据库或系统协调事务的复杂性。想象一下,您正在指挥一个管弦乐队,其中每个音乐家代表不同的数据库或服务。就像确保音乐的和谐需要精确的协调一样,在分布式系统中保持事务完整性需要仔细的编排。
在这里插入图片描述

这就是两阶段提交 (2PC) 的用武之地,这是 XA 事务的一个重要方面。2PC充当指挥,确保所有音乐家(或数据库参与者)在演奏最后一个音符之前准备好提交。正如每件乐器都必须在交响乐达到高潮之前保持音调一样,2PC 确保分布式事务的所有组件在继续之前保持同步,从而保证整个分布式环境中事务的完整性。
在这里插入图片描述

典型用例包括对同一事务使用多个数据库系统的应用程序。在 Java 生态系统中,用例可能是同时使用 JPA 和 JMS 的企业应用程序(即部署在应用程序服务器上的 EAR),JTA 协调分布式事务。

当MySQL成为参与的系统之一时,标准流程是:

XA START <xid>;
-- [... SQL Statements ...]
XA END <xid>;
XA PREPARE <xid>;
XA COMMIT <xid>;

是事务 ID,是事务协调器(即 JTA)生成的唯一标识符。当企业应用程序将 JPA 与配置为使用 JTA 一起使用时:persistence.xml

<persistence-unit name="samplePU" transaction-type="JTA">
<!-- [...] -->
</persistence-unit>

…SQL 语句包装在 XA 事务中。

大多数时候,上述流程完美无缺。直到应用程序断开 和 之间的会话。这时有趣的事情发生了…PREPARECOMMIT

症状
停滞在该状态的事务可能会在一段时间内未被检测到。就应用程序而言,数据库无法访问,因此它可能会重试事务并成功。PREPARED

但对于MySQL来说,事务仍处于准备状态,等待最终裁决:提交或回滚。您可以在以下输出中找到此类事务:SHOW ENGINE INNODB STATUS

---TRANSACTION 39898344, ACTIVE (PREPARED) 1314869 sec
 4 lock struct(s), heap size 1128, 17 row lock(s), undo log entries 32

哎哟!超过 15 天前。更糟糕的是,您可能不会随便检查 Innodb 状态输出:是锁会迫使您进行调查。行锁或表锁将导致无缘无故的超时。然后你开始搜索,可能使用:

SELECT * FROM information_schema.innodb_trx;

啊哈!确实有一笔交易活跃了这么久!问题解决了吗?还没有。令人惊讶的是:TRX_MYSQL_THREAD_ID是 0。没有线程运行此事务,与正在运行的进程没有关联,也没有任何东西可以摆脱事务。您决定咬紧牙关并重新启动服务器。仍然没有喜悦:交易仍然存在,等待判决。尽管它可能很烦人,但它是完全有道理的。您可能希望交易在那里,但不知道如何解决这种情况。还。。。KILL
在这里插入图片描述

恢复
为了提交或回滚事务,您只需要事务的 ID。您可以通过发布以下命令来列出该州的所有交易:PREPARED

XA RECOVER;

此命令的输出并不完全是用户友好的,因此您可能需要尝试以下操作:

XA RECOVER CONVERT XID;

您需要此命令的权限,否则您将收到一条不太有用的错误消息:XA_RECOVER_ADMIN

SQL 错误 [1401] [XAE03]:XAER_RMERR:事务分支中发生致命错误 — 检查数据的一致性

这将使我们获得十六进制的珍贵。但是,这仍然不能被 或 使用。无论出于何种原因,这两个命令都希望分解为三个部分:XIDXA COMMITXA ROLLBACKXIDxid: gtrid [, bqual [, formatID ]]

gtrid 是全局事务标识符,bqual 是分支限定符,formatID 是标识 gtrid 和 bqual 值使用的格式的数字。如语法所示,bqual 和 formatID 是可选的。如果未给出,则默认 bqual 值为 ‘’。如果未给出,则默认 formatID 值为 1。

需要进行一些字符串操作:

GTRID: 它是 报告的 XID 的前 N 个字节,其中 N 位于 相同的列中XA RECOVERgtrid_length
bqual:它是 报告的 XID 的下一个 M 字节,其中 M 位于相同的列中XA RECOVERbqual_length
格式 ID: 这在列中可用formatID
完成切片后:

XA COMMIT <gtrid> , <bqual> , <formatID>
-- ...or...
XA ROLLBACK <gtrid> , <bqual> , <formatID>

问题解决了!

  • 31
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小徐博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值