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の方法とヒント

推薦する

純粋なHTML+CSSでタイピング効果を実現

この記事は主に、一定の参考値を持つ純粋な HTML + CSS によって実現されるタイピング効果を紹...

MySQL 4.1/5.0/5.1/5.5/5.6の主な違い

バージョン間でのコマンドの違い: innodb ステータスを表示\G mysql-5.1 エンジン ...

HTML で JavaScript の全選択/全選択解除操作を実行するサンプル コード

コードをコピーコードは次のとおりです。 <html> <ヘッド> <m...

jsで照明スイッチを制御する

参考までに、jsを使用して照明スイッチを制御します。具体的な内容は次のとおりです。トピック: js ...

Dockerにおけるオーバーレイネットワークの詳細な説明

Docker 公式ドキュメントからの翻訳、原文: https://docs.docker.com/n...

設計仕様に準拠した設計は良い設計でしょうか?

これまでの数年間、私はいわゆる「設計仕様」についてかなりの数の執筆やコンサルティングを行ってきました...

Linux コマンドラインターミナルで画面を分割するための 2 つのツール

ターミナル分割画面ツールは2つあります: screen と tmux 1. 画面分割を使用する(上下...

知っておくべき 7 つのネイティブ JS エラーの種類

目次概要1. 範囲エラー2. 参照エラー3. 構文エラー4. タイプエラー5. URIエラー6. 評...

WeChatアプレットで数字当てゲームを実装する実際のプロセス

目次機能紹介レンダリング1. ホームページレンダリング用のコード(index03) 2. ゲーム開始...

Vue コンポーネントでのアンチシェイクとスロットリングの使用例の分析

入力ボックスへのユーザー入力、ウィンドウのサイズ変更、スクロール、Intersection Obse...

vue-routeルーティング管理のインストールと設定方法

導入Vue Router 、 Vue.jsの公式ルーティング マネージャーです。 Vue.jsのコア...

MySQL インデックス使用状況監視スキル (収集する価値あり!)

概要リレーショナル データベースでは、インデックスは、データベース テーブル内の 1 つ以上の列の値...

Dockerを使用してSpringBootプロジェクトをデプロイする方法

Docker テクノロジの開発により、マイクロサービスの実装にさらに便利な環境が提供されます。Doc...

Vue 手書き読み込みアニメーション プロジェクト

ページが応答しない場合、白い画面が表示されないように、読み込みアニメーションを表示するのがユーザーフ...