文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF(US Ltr) - 39.9Mb
PDF(A4) - 40.0Mb
手册页(TGZ) - 258.5Kb
手册页(Zip) - 365.5Kb
Info(Gzip) - 4.0Mb
Info(Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  XA 事务状态

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 事务都没有特殊了解。如果当前会话尝试提交或回滚给定的 XA 事务(即使是它准备的 XA 事务),而另一个连接已经这样做,则该尝试将被拒绝,并出现无效的 XID 错误 (ER_XAER_NOTA),因为请求的 xid 不再存在。

注意

分离的 XA 事务不能使用临时表。

当分离的 XA 事务被禁用(xa_detach_on_prepare 设置为 OFF)时,XA 事务将保持连接,直到它被发起连接提交或回滚。对于在组复制中使用的 MySQL 服务器实例,不建议禁用分离的 XA 事务;有关更多信息,请参阅 服务器实例配置

如果 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 节,“导致隐式提交的语句” 中。