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)
在给定客户端连接的上下文中,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 节“导致隐式提交的语句” 中列出了前面的注释适用的 语句。