XA
トランザクションのサポートは、InnoDB
保存エンジンに限られています。
MySQL XA の実装は、MySQL サーバが Resource manager
の役割をしたり、クライアント プログラムが
Transaction Manager の役割をする 「外部 XA,」
のものです。「内部 XA」
は実装されていません。これによって、MySQL
サーバ内の個々の保存エンジンが RM
の役割をしたり、サーバそのものが TM
の役割をしたりすることができます。内部 XA
は、ひとつ以上の保存エンジンが関与する XA
トランザクションを処理するために必要になります。テーブル
ハンドラのレベルで 2
相コミットをサポートする保存エンジンを必要とするため、内部
XA の実装は不完全なもので、現時点では
InnoDB
だけです。
XA START
では、JOIN
および RESUME
句はサポートされていません。
XA END
では、SUSPEND [FOR
MIGRATE]
句はサポートされていません。
xid
値の
bqual
部分が、大規模トランザクション内の各 XA
トランザクションによって異なる必要があるという条件は、現在の
MySQL XA の実装の制限です。これは XA
の仕様によるものではありません。
XA トランザクションが PREPARED
状態に至ると、MySQL サーバが切断される (
例えば、Unix の kill -9 で )
、または不自然に停止する場合、サーバが再起動した後にトランザクションを続けることができるはずです。しかし、クライアントが再接続をし、トランザクションをコミットした場合、そのトランザクションは、たとえコミットされていても、バイナリ
ログには記録されないでしょう。これは、データとバイナリ
ログの同調が途切れたということです。XA
を複製と一緒に安全に使用することはできないと思われます。
サーバが保留になっている XA
トランザクションを、たとえ
PREPARED
状態に至っていても、ロールバックするということはありえます。これは、クライアントの接続が切断されて、サーバは起動を続ける、またはクライアントが接続されているのに、サーバが自然に停止する場合に起こります
。(
後者のケースでは、サーバが切断される各接続をマークし、それに関連する
PREPARED
XA
トランザクションをロールバックする )
。PREPARED
XA
トランザクションをコミットする、またはロールバックすることは可能であるはずですが、これはバイナリのロギング
メカニズムを変更なしには実行できません。