Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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.4 支持分离的 XA 事务,通过 xa_detach_on_prepare 系统变量(默认为 ON)启用。分离的事务在执行 XA PREPARE 语句后与当前会话分离,可以由另一个连接提交或回滚事务。这意味着当前会话可以开始一个新的本地事务或 XA 事务,而不需要等待准备的事务被提交或回滚。

当XA事务被分离,连接对任何已经准备好的XA事务没有特别的知识。如果当前会话尝试提交或回滚一个已经准备好的XA事务(即使是已经被另一个连接提交或回滚的), 尝试将被拒绝,返回无效XID错误(ER_XAER_NOTA),因为请求的xid已经不存在了。

Note

分离的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节,“隐式提交语句”中。