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