MySQL 8.0 リファレンスマニュアル


13.3.8 XA トランザクション

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

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

MySQL Connector/J 5.0.0 以上では、XA SQL ステートメントインタフェースを処理するクラスインタフェースを使用して XA が直接サポートされます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


関連キーワード:  ステートメント, トランザクション, CREATE, XA, TABLE, DROP, グローバル, サーバー, コミット, リソース