XA 事务状态
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 准备并提交事务。由于事务终止,XA RECOVER 不会列出 xid 值。
对于 PREPARED XA 事务,可以执行 XA COMMIT 语句来提交和终止事务,或者执行 XA ROLLBACK 来回滚和终止事务。
下面是一个简单的 XA 事务,它向表中插入一行,是全局事务的一部分:
1.mysql> XA START 'xatest';
2.Query OK, 0 rows affected (0.00 sec)
3.
4. mysql> INSERT INTO mytable (i) VALUES(10);
5. Query OK, 1 row affected (0.04 sec)
6.
7. mysql> XA END 'xatest';
8. Query OK, 0 rows affected (0.00 sec)
9.
10. mysql> XA PREPARE 'xatest';
11. Query OK, 0 rows affected (0.00 sec)
12.
13. mysql> XA COMMIT 'xatest';
14. Query OK, 0 rows affected (0.00 sec)
在给定客户端连接的上下文中,XA 事务和本地(非XA)事务是互斥的。例如,如果执行 XA START 开始 XA 事务,则在 XA 事务被提交或回滚之前,本地事务无法启动。相反,如果本地事务已经用 START TRANSACTION 语句启动,那么在事务被提交或回滚之前,不能使用 XA 语句。
如果 XA 事务处于 ACTIVE 状态,则不能执行任何导致隐式提交的语句。这将违反 XA 契约,因为无法回滚这个 XA 事务。尝试执行这样的语句会引发以下错误:
1.ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed
2.when global transaction is in the ACTIVE state