13.3.7.2 XATransaction 状态

XA 事务通过以下状态进行:

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

  • 对于ACTIVE XA 事务,请发出构成该事务的 SQL 语句,然后发出XA END语句。 XA END将 Transaction 置于IDLE状态。

  • 对于IDLE XA 事务,您可以发出XA PREPARE语句或XA COMMIT ... ONE PHASE语句:

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

  • XA COMMIT ... ONE PHASE准备并提交事务。 * xid *的值不会被XA RECOVER列出,因为事务终止。

  • 对于PREPARED XA 事务,您可以发出XA COMMIT语句来提交和终止该事务,或发出XA ROLLBACK来回滚并终止该事务。

这是一个简单的 XA 事务,它作为全局事务的一部分在 table 中插入一行:

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)

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

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

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

前面的 Comments 适用的语句在第 13.3.3 节“导致隐式提交的声明”处列出。