13.3.7.2 XATransaction 状态
XA 事务通过以下状态进行:
-
使用XA START启动 XA 事务并将其置于
ACTIVE
状态。 -
对于
ACTIVE
XA 事务,请发出构成该事务的 SQL 语句,然后发出XA END语句。 XA END将 Transaction 置于IDLE
状态。 -
对于
IDLE
XA 事务,您可以发出XA PREPARE语句或XA COMMIT ... ONE PHASE
语句: -
XA PREPARE将 Transaction 置于
PREPARED
状态。此时的XA RECOVER语句将在其输出中包含事务的*xid
*值,因为XA RECOVER列出了处于PREPARED
状态的所有 XA 事务。 -
XA COMMIT ... ONE PHASE
准备并提交事务。 *xid
*的值不会被XA RECOVER列出,因为事务终止。 -
对于
PREPARED
XA 事务,您可以发出XA COMMIT语句来提交和终止该事务,或发出XA ROLLBACK来回滚并终止该事务。
这是一个简单的 XA 事务,它作为全局事务的一部分在 table 中插入一行:
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)
在给定的 Client 端连接的上下文中,XA 事务和本地(非 XA)事务是互斥的。例如,如果已发出XA START以开始 XA 事务,则在 XA 事务已提交或回滚之前无法启动本地事务。相反,如果本地事务以START TRANSACTION开始,则在提交或回滚该事务之前,不能使用 XA 语句。
如果 XA 事务处于ACTIVE
状态,则不能发出任何导致隐式提交的语句。这将违反 XAContract,因为您无法回滚 XATransaction。如果您尝试执行这样的语句,则会收到以下错误:
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed
when global transaction is in the ACTIVE state
前面的 Comments 适用的语句在第 13.3.3 节“导致隐式提交的声明”处列出。