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.3 支持分离的 XA 事务,启用了 xa_detach_on_prepare
系统变量(默认为 ON
)。分离的事务在执行 XA PREPARE
后与当前会话断开连接(可以由另一个连接提交或回滚)。这意味着当前会话可以自由地启动新的本地事务或 XA 事务,而不需要等待准备的 XA 事务被提交或回滚。
当 XA 事务分离时,连接没有关于它准备的任何 XA 事务的特殊知识。如果当前会话尝试提交或回滚给定的 XA 事务(即使它准备了该事务),但另一个连接已经这样做了,那么尝试将被拒绝,出现无效的 XID 错误 (ER_XAER_NOTA
),因为请求的 xid
不再存在。
分离的 XA 事务不能使用临时表。
当分离的 XA 事务被禁用 (xa_detach_on_prepare
设置为 OFF
),XA 事务将保持连接,直到它被提交或回滚到原始连接。禁用分离的 XA 事务不建议用于组复制的 MySQL 服务器实例;请参阅 Server Instance Configuration,以获取更多信息。
如果 XA 事务处于 ACTIVE
状态,不能发出任何导致隐式提交的语句。这将违反 XA 合同,因为您不能回滚 XA 事务。尝试执行这样的语句将引发以下错误:
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed
when global transaction is in the ACTIVE state
适用于前述备注的语句列举在 Section 15.3.3, “Statements That Cause an Implicit Commit” 中。