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)
在给定客户端连接的上下文中,XA 事务和本地(非 XA)事务是互斥的。例如,如果XA
START
已发出以开始 XA 事务,则在提交或回滚 XA 事务之前无法启动本地事务。相反,如果本地事务已启动
START
TRANSACTION
,则在提交或回滚事务之前不能使用 XA 语句。
如果 XA 事务处于该ACTIVE
状态,则您不能发出任何导致隐式提交的语句。这将违反 XA 合同,因为您无法回滚 XA 事务。如果您尝试执行这样的语句,您会收到以下错误:
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed
when global transaction is in the ACTIVE state
第 13.3.3 节“导致隐式提交的语句” 中列出了前面的注释适用的 语句。