文档主页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  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 9.0 支持分离的 XA 事务,由 xa_detach_on_prepare 系统变量启用(默认情况下为 ON)。分离的事务在执行 XA PREPARE 之后会与当前会话断开连接(并且可以通过另一个连接进行提交或回滚)。这意味着当前会话可以自由地启动新的本地事务或 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 节,“导致隐式提交的语句” 中列出。