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