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
ではPREPARED
状態の XA トランザクションがすべてリストされるため、この時点でのXA RECOVER
ステートメントの出力にはトランザクションのxid
値が含まれます。XA COMMIT ... ONE PHASE
は、トランザクションの準備とコミットを行います。 トランザクションが終了するため、xid
値はXA RECOVER
によってリストされません。
PREPARED
XA トランザクションに対しては、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 トランザクションを開始するために XA START
が発行された場合は、その 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
前の注意事項が適用されるステートメントは、セクション13.3.3「暗黙的なコミットを発生させるステートメント」に示されています。