XA 事务通过以下状态进行
使用
XA START启动 XA 事务并将其置于ACTIVE状态。对于
ACTIVEXA 事务,请发出构成事务的 SQL 语句,然后发出XA END语句。XA END将事务置于IDLE状态。对于
IDLEXA 事务,您可以发出XA PREPARE语句或XA COMMIT ... ONE PHASE语句XA PREPARE将事务置于PREPARED状态。此时,XA RECOVER语句在其输出中包含事务的xid值,因为XA RECOVER列出所有处于PREPARED状态的 XA 事务。XA COMMIT ... ONE PHASE准备并提交事务。由于事务终止,xid值不会被XA RECOVER列出。
对于
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)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 节,“导致隐式提交的语句” 中列出。