13.3.7.2 XA トランザクションの状態

XA トランザクションは、次の各状態を経由して処理されます。

  1. XA START を使用して、XA トランザクションを開始し、それを ACTIVE 状態にします。

  2. ACTIVE XA トランザクションに対しては、トランザクションを構成する SQL ステートメントを発行したあと、XA END ステートメントを発行します。XA END は、トランザクションを IDLE 状態にします。

  3. IDLE XA トランザクションに対しては、XA PREPARE ステートメントまたは XA COMMIT ... ONE PHASE ステートメントのどちらかを発行できます。

    • XA PREPARE は、トランザクションを PREPARED 状態にします。この時点での XA RECOVER ステートメントは、XA RECOVERPREPARED 状態にあるすべての XA トランザクションをリストするため、その出力にトランザクションの xid 値が含まれます。

    • XA COMMIT ... ONE PHASE は、トランザクションの準備とコミットを行います。トランザクションが終了するため、xid 値は XA RECOVER によってリストされません。

  4. 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「暗黙的なコミットを発生させるステートメント」に示されています。


User Comments
Sign Up Login You must be logged in to post a comment.