mysql xa导致的事务一直running问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql xa导致的事务一直running问题相关的知识,希望对你有一定的参考价值。

参考技术A 使用xa进行测试时,对mysql进行了一些xa各阶段锁定试验,后来出现卡死情况就杀掉了线程,重启了mysql服务。重启后发现插入、修改数据都正常,但无法修改表结构,修改表结构就处于卡死状态,过一分多钟报超时错误。多次重启mysql服务后,问题依然如故.

查询innodb_trx表,发现有两个事务处于运行中。
SELECT * from information_schema.INNODB_TRX;

2.方案2--xa rollback--不起作用
还有资料说,通过 xarecover 查看当前xa事务,然后回滚或提交。

针对上面的xa rollback我们也可以尝试用xa commit,问题一样不能解决(需要再次重启mysql才能运行,否则会找不到对应的xid)。

通过重启mysql后事务依然存在,我们大概推断应该跟redoundo有关系,xa事务异常后,mysql服务重启检测到了这两个事务就自动运行了,但因为未知原因,这两个事务并没有执行,一直处于running状态。
曾经试图研究mysql的redo undo机制或者对应的文件格式,但时间关系没有深入。
尝试能否打开对应的redo文件,对里面的语句进行修改,但网上找了资料没有合适的工具可以做这个事情。
一直很苦恼的思索解决办法,也咨询身边的一些朋友,对没有遇到过这方面的问题。

今天灵机一动,奔着大不了重新安装mysql的心态进行了破坏性的探索,当然前提要提前把数据备份出来。尝试停止mysql服务后,将mysql对应的datadir目录下几个文件删除掉,对应文件见下图。

然后重启mysql服务,曾担心启动失败的,但没想到mysql顺利的启动成功了,然后查看对应的表,发现一只running的事务终于消失了。

后续有时间我会继续深入分析其中的原理。

MySQL的SQL语句 -事务性语句和锁定语句- XA 事务状态

XA 事务状态

XA 事务进程包含以下状态:

  1. 使用 XA START 启动 XA 事务并将其置于 ACTIVE 状态。

  2. 对于 ACTIVE XA 事务,执行组成事务的 SQL 语句,然后执行 XA END 语句。XA END 将事务置于 IDLE 状态。

  3. 对于 IDLE XA 事务,可以执行 XA PREPARE 语句或 XA COMMIT ... ONE PHASE 语句:

■ XA PREPARE 将事务置于 PREPARED 状态。在此节点的 XA RECOVER 语句在其输出中包含事务的 xid 值,因为 XA RECOVER 列出了处于 PREPARED 状态的所有 XA 事务。

■ XA COMMIT ... ONE PHASE 准备并提交事务。由于事务终止,XA RECOVER 不会列出 xid 值。

  1. 对于 PREPARED XA 事务,可以执行 XA COMMIT 语句来提交和终止事务,或者执行 XA ROLLBACK 来回滚和终止事务。

下面是一个简单的 XA 事务,它向表中插入一行,是全局事务的一部分:

1.mysql> XA START ‘xatest‘;
2.Query OK, 0 rows affected (0.00 sec)
3.
4. mysql> INSERT INTO mytable (i) VALUES(10);
5. Query OK, 1 row affected (0.04 sec)
6. 
7. mysql> XA END ‘xatest‘;
8. Query OK, 0 rows affected (0.00 sec)
9. 
10. mysql> XA PREPARE ‘xatest‘;
11. Query OK, 0 rows affected (0.00 sec)
12. 
13. mysql> XA COMMIT ‘xatest‘;
14. Query OK, 0 rows affected (0.00 sec)

在给定客户端连接的上下文中,XA 事务和本地(非XA)事务是互斥的。例如,如果执行 XA START 开始 XA 事务,则在 XA 事务被提交或回滚之前,本地事务无法启动。相反,如果本地事务已经用 START TRANSACTION 语句启动,那么在事务被提交或回滚之前,不能使用 XA 语句。

如果 XA 事务处于 ACTIVE 状态,则不能执行任何导致隐式提交的语句。这将违反 XA 契约,因为无法回滚这个 XA 事务。尝试执行这样的语句会引发以下错误:

1.ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed
2.when global transaction is in the ACTIVE state

官方网址:
https://dev.mysql.com/doc/refman/8.0/en/xa-states.html

以上是关于mysql xa导致的事务一直running问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql 跨库事务XA

MySQL 中基于 XA 实现的分布式事务

查看MySQL 支持的存储引擎

MySQL的SQL语句 -事务性语句和锁定语句- XA 事务状态

Mysql分布式事务

MySQL的SQL语句 -事务性语句和锁定语句- XA 事务 SQL 语句