次の状態での 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. 「暗黙のコミットを引き起こすステートメント」 でリストアップされています。
