13.3.7 XA トランザクション

XA トランザクションのサポートは、InnoDB ストレージエンジンに対して使用できます。MySQL XA 実装は、X/Open CAE ドキュメント分散トランザクション処理: XA 仕様に基づいています。このドキュメントは The Open Group によって発行されており、http://www.opengroup.org/public/pubs/catalog/c193.htm で入手できます。現在の XA 実装の制限については、セクションD.6「XA トランザクションの制約」で説明されています。

クライアント側には、特殊な要件は何もありません。MySQL サーバーへの XA インタフェースは、XA キーワードで始まる SQL ステートメントで構成されています。MySQL クライアントプログラムは、SQL ステートメントを送信したり、XA ステートメントインタフェースのセマンティクスを理解したりできる必要があります。これらが、最新のクライアントライブラリに対してリンクされている必要はありません。古いクライアントライブラリも機能します。

現在、MySQL Connector の中で、MySQL Connector/J 5.0.0 以降は、XA SQL ステートメントインタフェースを自動的に処理するクラスインタフェースを使用して XA を直接サポートします。

XA は分散トランザクション、つまり、複数の個別のトランザクションリソースがグローバルトランザクションに参加することを許可する機能をサポートしています。トランザクションリソースは多くの場合 RDBMS ですが、ほかの種類のリソースであってもかまいません。

グローバルトランザクションには、それ自体でトランザクションである複数のアクションが含まれますが、そのすべてがグループとして正常に完了するか、またはすべてがグループとしてロールバックされるかのどちらかである必要があります。基本的に、これは ACID プロパティーを1 レベル上に拡張することにより、複数の ACID トランザクションを、同じく ACID プロパティーを持つグローバル操作のコンポーネントとして連携して実行できるようにします。(ただし、分散トランザクションに対しては、SERIALIZABLE 分離レベルを使用して ACID プロパティーを実現する必要があります。非分散トランザクションに対しては REPEATABLE READ を使用すれば十分ですが、分散トランザクションに対しては不十分です。)

分散トランザクションのいくつかの例:

  • あるアプリケーションが、メッセージングサービスを RDBMS と組み合わせる統合ツールとして機能する場合があります。このアプリケーションは、同じくトランザクションデータベースを含む、メッセージの送信、取得、および処理を行うトランザクションがすべて、確実にグローバルトランザクション内で実行されるようにします。これは、トランザクション電子メールと考えることができます。

  • アプリケーションが、MySQL サーバーや Oracle サーバー (または複数の MySQL サーバー) などの異なるデータベースサーバーに関連するアクションを実行します。ここで、複数のサーバーに関連するアクションは、各サーバーに対してローカルな個別のトランザクションとしてではなく、グローバルトランザクションの一部として実行する必要があります。

  • 銀行が口座情報を RDBMS 内に保持し、現金自動預け払い機 (ATM) を通して現金を出し入れしています。ATM のアクションが口座に正しく反映されるように保証することが必要ですが、これは RDBMS だけでは実行できません。グローバルなトランザクションマネージャーが ATM とデータベースリソースを統合して、財務トランザクションの全体的な一貫性を確保します。

グローバルトランザクションを使用するアプリケーションには、1 つまたは複数のリソースマネージャーと 1 つのトランザクションマネージャーが含まれています。

  • リソースマネージャー (RM) は、トランザクションリソースへのアクセスを提供します。データベースサーバーは、1 つの種類のリソースマネージャーです。これは、RM によって管理されているトランザクションをコミットまたはロールバックできる必要があります。

  • トランザクションマネージャー (TM) は、グローバルトランザクションの一部であるトランザクションを調整します。これは、これらの各トランザクションを処理する RM と通信します。グローバルトランザクション内の個々のトランザクションは、グローバルトランザクションのブランチです。グローバルトランザクションとそのブランチは、あとで説明されている名付けスキームによって識別されます。

XA MySQL の MySQL 実装では、MySQL サーバーは、グローバルトランザクション内の XA トランザクションを処理するリソースマネージャーとして機能できます。MySQL サーバーに接続するクライアントプログラムは、トランザクションマネージャーとして機能します。

グローバルトランザクションを実行するには、どのコンポーネントが関連しているかを知り、各コンポーネントをそのコミットまたはロールバックが可能なポイントに持っていくことが必要です。各コンポーネントが自身の成功する能力に関してレポートする内容に応じて、それらのすべてが、アトミックグループとしてコミットまたはロールバックする必要があります。つまり、すべてのコンポーネントがコミットするか、またはすべてのコンポーネントがロールバックする必要があります。グローバルトランザクションを管理するには、いずれかのコンポーネントまたは接続しているネットワークが失敗する可能性があることを考慮に入れる必要があります。

グローバルトランザクションを実行するためのプロセスでは、2 フェーズコミット (2PC) が使用されます。これは、グローバルトランザクションのブランチによって実行されるアクションが実行されたあとに行われます。

  1. 最初のフェーズでは、すべてのブランチが準備されます。つまり、これらは TM からコミットの準備を行うよう指示されます。これは通常、ブランチを管理する各 RM が、そのブランチのアクションを安定したストレージ内に記録することを示します。これらのブランチはこれを実行できるかどうかを示し、これらの結果が 2 番目のフェーズに使用されます。

  2. 2 番目のフェーズでは、TM が RM にコミットまたはロールバックのどちらを行うかを指示します。すべてのブランチが、準備できたときにコミットできることを示した場合は、すべてのブランチがコミットするよう指示されます。いずれかのブランチが、準備できたときにコミットできないことを示した場合は、すべてのブランチがロールバックするよう指示されます。

場合によっては、グローバルトランザクションで 1 フェーズコミット (1PC) が使用されることがあります。たとえば、グローバルトランザクションが 1 つのトランザクションリソース (つまり、1 つのブランチ) だけで構成されていることがトランザクションマネージャーによって検出された場合は、そのリソースに準備とコミットを一度に行うよう指示できます。


User Comments
Sign Up Login You must be logged in to post a comment.