InnoDB
ストレージエンジンでは、XA
トランザクションがサポートされています。MySQL
XA インプリメンテーションは X/Open CAE
ドキュメント Distributed Transaction
Processing:XA 仕様
に基づいています。このドキュメントは The Open
Group
によって発行されており、http://www.opengroup.org/public/pubs/catalog/c193.htm
で入手できます。現在の XA
インプリメンテーションの制限については、Restrictions on XA Transactions
で説明されています。
クライアント側には、特別なことは何も要求されません。MySQL
サーバーへの XA
インタフェースは、XA
キーワードで始まる SQL
ステートメントで構成されています。MySQL
クライアントプログラムは、SQL
ステートメントを送り、XA
ステートメントインタフェースの動作を理解することが可能である必要があります。それらは最近のクライアントライブラリに違反してリンクされる必要はありません。古いクライアントライブラリもまた機能します。
現在、MySQL コネクタの間では、MySQL コネクタ/J 5.0.0 は (Xan SQL ステートメントインタフェースを自動的に処理するクラスインタフェースを使用して) XA を直接サポートします。
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 つのトランザクションリソースで成り立っているグローバルトランザクションを見つけたら (それを単一ブランチといいます)、そのリソースには準備とコミットを同時にするように指示が出されます。