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