15.3.8.2 XA 事务状态
XA 事务会经历以下状态:
-
使用
XA START
启动一个 XA 事务,并将其置于ACTIVE
状态。 -
对于一个
ACTIVE
XA 事务,执行包含事务的 SQL 语句,然后执行XA END
语句。XA END
将事务置于IDLE
状态。 -
对于一个
IDLE
XA 事务,可以执行XA PREPARE
语句或XA COMMIT ... ONE PHASE
语句:-
XA PREPARE
将事务置于PREPARED
状态。在这个状态下,使用XA RECOVER
语句时,会将事务的xid
值包含在输出中,因为XA RECOVER
列出所有在PREPARED
状态的 XA 事务。 -
XA COMMIT ... ONE PHASE
准备并提交事务。xid
值不再被XA RECOVER
列出,因为事务已经终止。
-
-
对于一个
PREPARED
XA 事务,可以执行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节,“隐式提交语句”中。