次の状態での XA トランザクションの進歩
XA トランザクションをスタートさせる為に
XA START
を利用し、それを
ACTIVE
な状態にして下さい。
ACTIVE
XA
トランザクションには、トランザクションを形成する
SQL ステートメントを発行し、それから
XA END
ステートメントを発行してください。XA
END
はトランザクションを
IDLE
の状態にします。
IDLE
XA
トランザクションには、XA
PREPARE
ステートメントか XA
COMMIT ... ONE PHASE
ステートメントのどちらかを発行できます。ONE
PHASE
ステートメント:
XA PREPARE
はトランザクションを
PREPARED
の状態にします。
この時点の XA RECOVER
ステートメントは、XA
RECOVER
が PREPARED
な状態にある全ての XA
トランザクションをリストにする為、そのアウトプットの中にトランザクションの
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
ステートメントが上記のどの注意事項に当てはまるのかは、項12.4.3. 「暗黙のコミットを引き起こすステートメント」 でリストアップされています。