InnoDB
ストレージ
エンジンでは、XA
トランザクションがサポートされています。MySQL
XA インプリメンテーションは X/Open CAE
ドキュメント Distributed Transaction
Processing:XA 仕様
に基づいています。この文書はオープン
グループによって出版されていて、http://www.opengroup.org/public/pubs/catalog/c193.htm
で入手可能です。現在の XA
インプリメンテーションの制限については、
項D.5. 「XA トランザクションの規制」 で説明されています。
クライアント側には、特別な事は何も要求されません。MySQL
サーバへの XA
インターフェースは、XA
キーワードで始まる SQL
ステートメントで構成されています。MySQL
クライアント プログラムは、SQL
ステートメントを送り、XA ステートメント
インターフェースの動作を理解する事が可能である必要があります。それらは最近のクライアント
ライブラリに違反してリンクされる必要はありません。古いクライアント
ライブラリもまた機能します。
現在、MySQL コネクタの中では、MySQL コネクタ/J 5.0.0 が XA ディレクトリをサポートします。 (XA SQL ステートメント インターフェースを扱うクラス インターフェースを利用して)
XA は分散型のトランザクションをサポートします。それは、複数の別々のトランザクション リソースを、グローバル トランザクションに参加させる事ができる能力です。トランザクション リソースは RDBMS である事が多いのですが、別の種類である可能性もあります。
グローバル
トランザクションは、それら自身の中でトランザクションのアクションをいくつか含んでいますが、それらは全て、グループとして成功するか、グループとしてロールバックされる必要があります。要するに、これは複数の
ACID トランザクションが、ACID
特性を持つグローバル操作のコンポーネントとして一斉に実行されるように
ACID 特性を 「1レベル上げる」
という事です。(しかし、分散型のトランザクションには、ACID
特性を達成する為に、SERIALIZABLE
分離レベルを利用しなければいけません。非分散型のトランザクションには
REPEATABLE READ
の利用で十分ですが、分散型のトランザクションに対しては十分では有りません。)
分散型トランザクションのいくつかの例
アプリケーションは、メッセージ サービスと RDBMS を合体させる統合ツールとして機能します。アプリケーションは、メッセージの送信、検索、さらにトランザクションのデータベースも巻き込んで処理を行うトランザクションが、全て確実にグローバル トランザクションの中で行われるようにします。これを 「トランザクションの電子メール」 だと考える事ができます。
アプリケーションは、複数のサーバを含むアクションが、各サーバに対する別々のローカル トランザクションではなく、グローバル トランザクションの一部として発生する、MySQL サーバやオラクル サーバ(または複合 MySQL サーバ)のような、異なるデータベースを含むアクションを実行します。
銀行は、RDBMS 内に口座情報を保持し、現金自動支払機(ATM)を通してお金を配布、受け取りします。ATM のアクションは口座に正確に反映されなければいけませんが、これは RDBMS だけでは行えません。グローバル トランザクション マネージャーが、金融取引全体の整合性を保障する為に、現金 ATM とデータベース リソースを統合します。
グローバル トランザクションを利用するアプリケーションは、1つ、または複数のリソース マネージャと、1つのトランザクション マネージャを含んでいます。
リソース マネージャ(RM)はトランザクションのリソースにアクセスを供給します。データベース サーバはリソース マネージャの1つです。RM によって管理されたトランザクションをコミットしたり、ロールバックしたりする事が可能なはずです。
トランザクション マネージャ(TM)はグローバル トランザクションの一部であるトランザクションを調整します。これは、これらの各トランザクションを扱う RM と通信します。グローバル トランザクション内の各トランザクションは、グローバル トランザクションの 「ブランチ」 です。グローバル トランザクションと、それらのブランチは、後ほど紹介される名づけスキームによって識別されます。
XA MySQL の MySQL インプリメンテーションは、MySQL サーバがグローバル トランザクション内で XA トランザクションを扱うリソース マネージャとして機能する事を可能にします。MySQL サーバに接続するクライアントプログラムは、トランザクション マネージャとして機能します。
グローバル トランザクションを実行するには、どのコンポネントが関係しているかを知り、それらをそれぞれ、コミットまたはロールバックできる時にポイントまで持ってくる事が必要です。 各コンポネントがそれぞれの能力についてどのようなレポートをするかによって、それらは全て1つのアトミック グループとしてコミット、またはロールバックしなければいけません。 それは、全てのコンポネントがコミットするか、または全てのコンポネントがロールバックするという事です。グローバル トランザクションを管理するには、コンポネントか、接続ネットワークが失敗する可能性があるという事を考慮に入れておく事が必要です。
グローバル トランザクションを実行するプロセスは、二相コミットを利用します。(2PC)これは、グローバル トランザクションのブランチによって行われるアクションが実行された後に起こります。
第一段階で、全てのブランチが準備されます。それは、TM からコミットの準備の命令が出るという事です。通常、これはブランチが管理する各 RM が、安定したストレージの中にブランチの為のアクションを記録するという事を意味します。ブランチは、それらが利用可能かどうかを指示し、その結果は第二段階に利用されます。
第二段階では、TM が RM にロールバックを行うかどうかの指示を出します。もし全てのブランチの準備が整った時それらがコミットが可能だという連絡を出せは、それら全てにコミットの指示が出されます。もしブランチの準備が整った時にどれか1つでもコミットが不可能であるという連絡があれば、全てのブランチにロールバックの指示が出されます。
場合によっては、グローバル トランザクションは単相コミットを利用します。(1PC)例えば、トランザクション マネージャがたった1つのトランザクション リソースで成り立っているグローバル トランザクションを見つけたら(それを単一ブランチといいます)、そのリソースには準備とコミットを同時にするように指示が出されます。