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