Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

15.3.8.2 XA 事务状态

XA 事务经过以下状态:

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

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

  3. 对于 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 的输出中,因为事务终止。

  4. 对于 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 不再存在。

Note

分离的 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” 中。