XA 事务会经历以下状态
使用
XA START
启动 XA 事务并将其置于ACTIVE
状态。对于
ACTIVE
XA 事务,发出构成事务的 SQL 语句,然后发出XA END
语句。XA END
将事务置于IDLE
状态。对于
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
列出。
对于
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 节,“导致隐式提交的语句” 中。