Documentation Home

13.3.7.2 XA 事务状态

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

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

  2. 对于ACTIVEXA 事务,发出组成事务的 SQL 语句,然后发出一条XA END语句。 XA END将交易置于 IDLE状态。

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

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

    • XA COMMIT ... ONE PHASE准备并提交交易。该 xid值未列出, XA RECOVER因为事务终止。

  4. 对于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)

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

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

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

第 13.3.3 节“导致隐式提交的语句” 中列出了前面的注释适用的 语句。