MySQL 8.0 リファレンスマニュアル


13.3.8.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 では PREPARED 状態の XA トランザクションがすべてリストされるため、この時点での XA RECOVER ステートメントの出力にはトランザクションの 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「暗黙的なコミットを発生させるステートメント」に示されています。


関連キーワード:  ステートメント, XA, トランザクション, CREATE, TABLE, DROP, サブクエリー, FUNCTION, SLAVE, 状態