MySQL XA で分散トランザクションを実装する方法

MySQL XA で分散トランザクションを実装する方法

序文

MySQL が単一マシンのトランザクションを適切にサポートしていることは間違いありません。では、複数のノードを含む分散システムでは、MySQL は分散トランザクションをどのように実装するのでしょうか?例えば、業務システムを開発する場合、外部からのリクエストを受け付け、複数の内部システムにアクセスしてリクエストを実行します。実行中に、複数のデータベース(D1、D2、D3)の値を同時に更新する必要があります。システムは一貫している必要があるため、3 つのデータベースの値は同時に正常に更新されるか、まったく更新されないかのいずれかになります。そうでない場合、サブシステムの一部の命令は成功しますが、一部の命令は実行されません。これにより、結果を理解する際に混乱が生じます。

では、MySQL はどのようにして複数の MySQL データベースを更新する際に一貫性を実現するのでしょうか?それがMySQL XAです。 MySQL は、XA 仕様の 2 フェーズ コミット プロトコルをサポートすることで、複数のデータベースの操作を実装します。

XA プロトコル

XA 仕様について説明するときは、DTP モデル (分散トランザクション処理) について説明しなければなりません。 XA 仕様では、DTP モデル内の 2 つのモジュール (トランザクション マネージャーとリソース マネージャー) 間の通信方法が規定されています。 DTPは実際には分散トランザクション処理です

ここに画像の説明を挿入

各モジュールの機能は次のとおりです。

  • AP (アプリケーション プログラム): アプリケーションは、トランザクション境界 (トランザクションの開始と終了を定義) を定義し、トランザクション境界内のリソースにアクセスします。
  • RM (リソース マネージャー): 共有リソースを管理し、外部アクセス インターフェイスを提供します。外部プログラムがデータベースなどの共有リソースにアクセスできるようにします。さらに、RM にはトランザクションをロールバックする機能もあります。
  • TM (トランザクション マネージャー): TM は分散トランザクションのコーディネーターです。TM は各 RM と通信し、グローバル トランザクションの管理、トランザクションの一意の識別子の割り当て、トランザクション実行の進行状況の監視、トランザクションの送信、ロールバック、障害回復などを担当します。

最初は理解しにくいかもしれません。要約すると、アプリケーションがリソース マネージャーによって提供される共有リソースにアクセスして使用し、トランザクション マネージャーによって提供されるトランザクション インターフェイス (TX インターフェイス) を介してトランザクション操作を定義するアーキテクチャです。トランザクション マネージャーとリソース管理は、XA 仕様に基づいて 2 フェーズ コミット プロトコルを実行します。
XA仕様のプロセスを次の図に示す。

ここに画像の説明を挿入

  • アプリケーションプログラムAPはトランザクションマネージャTMにトランザクション要求を開始する。
  • TMはxa_open()を呼び出してリソースマネージャとのセッションを確立する
  • TMはトランザクションブランチの開始をマークするためにxa_start()を呼び出す
  • AP はリソース マネージャー RM にアクセスし、レコードの挿入などの操作を定義します。
  • TMはトランザクションブランチの終了をマークするためにxa_end()を呼び出す
  • TM は xa_prepare() を呼び出して、トランザクション ブランチの送信の準備を RM に通知します。実際、これは 2 段階の送信のうちの送信要求フェーズです。
  • TM は xa_commit() を呼び出して、RM にトランザクション ブランチをコミットするように通知します。これは、2 フェーズ コミットのコミット実行フェーズです。
  • TM は RM とのセッションを管理するために xa_close を呼び出します。
    • これらのインターフェースは順番に実行する必要があります。たとえば、xa_start インターフェースは xa_end の前に実行する必要があります。また、トランザクション マネージャーはトランザクション ブランチをマークするだけで、トランザクションを実行しないことに注意してください。トランザクション操作は、最終的にアプリケーションがリソース マネージャーに通知することで完了します。さらに、XAインターフェースをまとめてみましょう
  • xa_start: トランザクション ブランチの開始または再開と、呼び出しスレッドへの XID の管理を担当します。
  • xa_end: 現在のスレッドとトランザクションブランチの関係を解除する役割を担う
  • xa_prepare: RMにトランザクションブランチをコミットする準備ができているかどうかを問い合わせる役割 xa_commit: RMにトランザクションブランチをコミットするように通知する
  • xa_rollback: トランザクションブランチをロールバックするようRMに通知する

MySQL XA で分散トランザクションを実装する方法

MySQL には 2 種類の XA トランザクションがあります。1 つは内部 XA トランザクションで、主にストレージ エンジンとバイナリ ログの調整に使用されます。もう 1 つは外部分散トランザクション (複数のデータベースによって実装される分散トランザクションなど) に参加できる外部トランザクションです。ここでは主に外部トランザクションについて説明します。

注意: 分散トランザクションは、分離レベルが Serializable に設定されている場合にのみ MySQL で使用できます。
MySQLのXA構文は次のとおりです。

XA {START|BEGIN} xid [JOIN|RESUME]
XA準備xid
XA 終了 xid
XA COMMIT xid[ワンフェーズ]
XA ロールバック xid
XA リカバリ[XID 変換]

このうち、xid はトランザクション ID であり、トランザクション ブランチを一意に表します。各トランザクション ブランチには ID があります。
まず、XA 機能が有効になっているかどうかを確認します。

ここに画像の説明を挿入

分離レベルをシリアライズ可能に設定する

ここに画像の説明を挿入

実行結果

ここに画像の説明を挿入

まず、「XA START 'xid'」コマンドを呼び出してXAトランザクションをACTIVATE状態にし、次にトランザクションを構成する複数のSQL文(updateなど)を実行します。
t1 set c1 = 'a' where id=1)、つまりトランザクション境界を指定します。次に、「XA END 'xid'」を呼び出してトランザクションを IDLE 状態にします。これはトランザクション境界を終了することを意味します。

ここに画像の説明を挿入

次に、IDLE 状態の XA トランザクションに対して、「XA PREPARE」コマンドまたは「XA COMMIT...ONE PHASE」コマンドを実行できます。
2 フェーズ コミット プロトコルのコミット要求フェーズを実行するための PREPARE。 「XA RECOVER」コマンドを実行すると、PREPARED 状態のすべての XA トランザクションがリストされます。 1000
COMMIT…ONE PHASE は、トランザクションを準備してコミットするために使用されます。つまり、1 フェーズ プロトコルに変換して、トランザクションを直接コミットします。

ここに画像の説明を挿入

最後に、「XA COMMIT」を呼び出してトランザクションをコミットします (または、「XA ROLLBACK」を呼び出してトランザクションをロールバックします)。これにより、グローバルトランザクションの一貫性が実現されます。

ここに画像の説明を挿入

上記のプロセスから、MySQL データベースの分散トランザクションでは、MySQL の役割は実際には XA トランザクション プロセスにおける RM であり、TM は MySQL サーバーに接続されたクライアントであることがわかります。分散トランザクションでは、通常、少なくとも 2 つの RM が関係します。したがって、MySQL が XA プロトコルをサポートすると言う場合、MySQL を RM として参照しており、これは MySQL が XA プロトコルで RM が持つべき機能を実装していることを意味します。

これで、MySQL XA が分散トランザクションを実装する方法についてのこの記事は終わりです。MySQL XA 分散トランザクションの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLクエリトランザクション処理へのノード接続の実装
  • MySQL データベース トランザクション例のチュートリアル
  • MySQL と Golan 間の従来の分散トランザクションのための 7 つのソリューション
  • MySQLトランザクションが効率に与える影響の分析と概要
  • MySQL トランザクション分離レベルの詳細
  • MySQLデータベースのトランザクションとインデックスの詳細な説明
  • MySQL トランザクション分析

<<:  HTML a タグの href 属性を使用して相対パスと絶対パスを指定する方法

>>:  ウェブページの読み込み速度を上げる25の方法とヒント

推薦する

iframe なしの div ネスト HTML

最近、宿題をしているときに、iframe を使用せずにページをネストする必要があったため、jquer...

SQL インジェクションの詳細

1. SQL インジェクションとは何ですか? SQL インジェクションは、入力パラメータに SQL ...

既存のDockerコンテナの内容を変更する方法

1. Docker psはコンテナをリストします 2. Docker cpはコンテナにファイルをコピ...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...

WindowsにOpenSSHをインストールし、SSHキーを生成してLinuxサーバーにログインします。

SSH の正式名称は Secure SHell です。 SSH を使用すると、送信されるすべてのデ...

dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明

問題の起源docker を使用する場合、残念ながら docker コンテナ内のホストのポート 80 ...

Google Web Fonts でウェブサイトに無制限のフォントを追加

長い間、リソースの制約により、使用できるフォントが限られていたため、Web サイトの開発は妨げられて...

nginx で仮想ホストを構成するための詳細な手順

仮想ホストは、インターネット上で実行されているサーバー ホストを複数の「仮想」ホストに分割する特殊な...

css3 flexレイアウト justify-content:space-between 最後の行は左揃えになります

justify-content:space-betweenレイアウトを使用する場合、要素の最後の行に...

Vue のルータールーティングの 2 つのモード (ハッシュと履歴) の詳細な説明

ハッシュモード(デフォルト)動作原理:ウェブページのハッシュ値の変化を監視する—> onhas...

IE6では画像要素imgに余分な空白スペースがある

ページの DIV+CSS レイアウトを行う際、IE6 で画像要素 img の下に余分なスペースができ...

MySQLの文字セットを変更する方法

1. MySQLの文字セットを確認する '%char%' のような変数を表示します。...

Ubuntu 20.04 に GitLab をインストールして設定する方法

導入GitLab CE または Community Edition は、主に Git リポジトリのホ...

jsvc を使用して tomcat を起動する方法 (通常のユーザーとして実行)

jsvc の紹介実稼働環境では、Tomcat はデーモン モードで実行する必要があります。Tomc...

MySQL 5.5 の導入に関する問題

MySQL の導入現在、会社ではプラットフォーム運用を通じてMySQLを導入しています。金曜日、プラ...