An XA transaction progresses through the following states:
Use
XA STARTto start an XA transaction and put it in theACTIVEstate.For an
ACTIVEXA transaction, issue the SQL statements that make up the transaction, and then issue anXA ENDstatement.XA ENDputs the transaction in theIDLEstate.For an
IDLEXA transaction, you can issue either anXA PREPAREstatement or anXA COMMIT ... ONE PHASEstatement:XA PREPAREputs the transaction in thePREPAREDstate. AnXA RECOVERstatement at this point includes the transaction'sxidvalue in its output, becauseXA RECOVERlists all XA transactions that are in thePREPAREDstate.XA COMMIT ... ONE PHASEprepares and commits the transaction. Thexidvalue is not listed byXA RECOVERbecause the transaction terminates.
For a
PREPAREDXA transaction, you can issue anXA COMMITstatement to commit and terminate the transaction, orXA ROLLBACKto roll back and terminate the transaction.
Here is a simple XA transaction that inserts a row into a table as part of a global transaction:
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)
Within the context of a given client connection, XA transactions
and local (non-XA) transactions are mutually exclusive. For
example, if XA
START has been issued to begin an XA transaction, a
local transaction cannot be started until the XA transaction has
been committed or rolled back. Conversely, if a local
transaction has been started with
START
TRANSACTION, no XA statements can be used until the
transaction has been committed or rolled back.
If an XA transaction is in the ACTIVE state,
you cannot issue any statements that cause an implicit commit.
That would violate the XA contract because you could not roll
back the XA transaction. The following error is raised if you
try to execute such a statement:
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed
when global transaction is in the ACTIVE stateStatements to which the preceding remark applies are listed at Section 13.3.3, “Statements That Cause an Implicit Commit”.