15.3.8.2 XA 事务状态
XA 事务会经历以下状态:
-
使用
XA START启动一个 XA 事务,并将其置于ACTIVE状态。 -
对于一个
ACTIVEXA 事务,执行包含事务的 SQL 语句,然后执行XA END语句。XA END将事务置于IDLE状态。 -
对于一个
IDLEXA 事务,可以执行XA PREPARE语句或XA COMMIT ... ONE PHASE语句:-
XA PREPARE将事务置于PREPARED状态。在这个状态下,使用XA RECOVER语句时,会将事务的xid值包含在输出中,因为XA RECOVER列出所有在PREPARED状态的 XA 事务。 -
XA COMMIT ... ONE PHASE准备并提交事务。xid值不再被XA RECOVER列出,因为事务已经终止。
-
-
对于一个
PREPAREDXA 事务,可以执行XA COMMIT语句以提交和终止事务,或者XA ROLLBACK语句以回滚和终止事务。
以下是一个简单的 XA 事务,插入一个行到表中作为全局事务的一部分:
mysql> XA START 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO mytable (i) VALUES(10);
Query OK, 1 row affected (0.04 sec)
mysql> XA END 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> XA PREPARE 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> XA COMMIT 'xatest';
Query OK, 0 rows affected (0.00 sec)
MySQL 8.4 支持分离的 XA 事务,通过 xa_detach_on_prepare 系统变量(默认为 ON)启用。分离的事务在执行 XA PREPARE 语句后与当前会话分离,可以由另一个连接提交或回滚事务。这意味着当前会话可以开始一个新的本地事务或 XA 事务,而不需要等待准备的事务被提交或回滚。
当XA事务被分离,连接对任何已经准备好的XA事务没有特别的知识。如果当前会话尝试提交或回滚一个已经准备好的XA事务(即使是已经被另一个连接提交或回滚的), 尝试将被拒绝,返回无效XID错误(ER_XAER_NOTA),因为请求的xid已经不存在了。
分离的XA事务不能使用临时表。
当分离的XA事务被禁用(xa_detach_on_prepare设置为OFF),XA事务将保持连接状态,直到由原始连接提交或回滚。禁用分离的XA事务不推荐在群组复制中使用MySQL服务器实例;见服务器实例配置,了解更多信息。
如果XA事务处于ACTIVE状态,您不能执行任何可能隐式提交的语句。这将违反XA合同,因为您不能回滚XA事务。尝试执行这样的语句将引发以下错误:
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed
when global transaction is in the ACTIVE state
以下语句列表在第15.3.3节,“隐式提交语句”中。