MVCCとは
一般的に、MySQL データベースを使用する場合は、Innodb ストレージ エンジンを使用することが知られています。Innodb ストレージ エンジンはトランザクションをサポートしています。そのため、複数のスレッドが同時にトランザクションを実行すると、同時実行の問題が発生する可能性があります。このとき、同時実行性を制御できる方法が必要となり、MVCC がこの役割を果たします。 MySQL ロックとトランザクション分離レベルMVCC メカニズムの原理を理解する前に、まず MySQL のロック メカニズムとトランザクション分離レベルを理解する必要があります。MyISAM ストレージ エンジンは別として、Innodb ストレージ エンジンには行ロックとテーブル ロックの 2 種類のロックがあります。テーブル ロックは 1 回の操作でテーブル全体をロックします。ロックの粒度は最も大きくなりますが、パフォーマンスは最も低く、デッドロックは発生しません。行ロックは一度に 1 行をロックします。ロックの粒度は小さく、同時実行性は高くなりますが、デッドロックが発生する可能性があります。 Innodb の行ロックは、共有ロック (読み取りロック) と排他ロック (書き込みロック) に分けられます。トランザクションが行に読み取りロックを追加すると、他のトランザクションは行の読み取りは許可されますが、書き込み操作は許可されません。他のトランザクションも行に書き込みロックを追加することはできませんが、読み取りロックは追加できます。 トランザクションが行に書き込みロックを追加すると、他のトランザクションはこの行に書き込むことはできませんが、読み取ることはできます。同時に、他のトランザクションはこの行に読み取り/書き込みロックを追加することはできません。 MySQL のトランザクション分離レベルを見てみましょう。これは次の 4 つのレベルに分かれています。
MySQL 元に戻すログMVCC は、最下層で Mysql の undo ログに依存しています。undo ログには、データベースの操作が記録されます。undo ログは論理ログであるため、レコードが削除されると、undo ログには対応する挿入レコードが記録されます。レコードが更新されると、undo ログには反対の更新レコードが記録されます。トランザクションが失敗してロールバックする必要がある場合は、undo ログの対応するコンテンツを読み取ることでロールバックできます。MVCC は undo ログを利用します。 MVCCの実装原則MVCC の実装では、データベースの暗黙的なフィールド、UNDO ログ、および ReadView が使用されます。まず、暗黙のフィールドを見てみましょう。実際、MySQL はテーブルの各行の背後に次の隠しフィールドを暗黙的に記録します: DB_TRX_ID (最後に変更された (変更/挿入) トランザクションの ID)、DB_ROLL_PTR (このレコードの前のバージョンを指すロールバック ポインター)、および DB_ROW_ID (自動増分 ID。データ テーブルに主キーがない場合、クラスター化インデックスはデフォルトでこの ID を使用して作成されます)。 UNDO ログには 2 種類あります。挿入 UNDO ログは、新しいレコードが挿入されたときに生成される UNDO ログです。トランザクションがロールバックされたときにのみ必要で、トランザクションがコミットされた直後に破棄できます。更新 UNDO ログは、トランザクションが更新または削除されたときに生成される UNDO ログです。トランザクションがロールバックされたときだけでなく、スナップショットが読み取られたときにも必要です。したがって、気軽に削除することはできません。高速読み取りまたはトランザクション ロールバックがログに関係しない場合にのみ、対応するログがパージ スレッドによって均一にクリアされます。 MVCC は更新元に戻すログを使用します。 実際、UNDO ログにはバージョン チェーンが記録されます。データベースに次のようなレコードがあるとします。 ここで、このレコードを変更し、名前を tom に変更するトランザクション A があります。このときの操作フローは次のとおりです。
この時点での状況は以下のとおりです。 このとき、別のトランザクション B がこのレコードを変更し、年齢を 28 に変更します。このときの操作フローは次のとおりです。
この時点での状況は以下のとおりです。 上記から、異なるトランザクションまたは同じトランザクションによって同じレコード行に加えられた変更により、レコード行の UNDO ログによってバージョン チェーンが形成されることがわかります。UNDO ログ チェーンの先頭は最新の古いレコードであり、チェーンの末尾は最も古いレコードです。 ここで、ある状況を想定してみましょう。トランザクション A もトランザクション B もコミットされていないとします。この時点で、tom というレコードを変更し、age を 30 に変更するトランザクション C があります。その後、トランザクションがコミットされます。トランザクション C の ID は 3 です。同様に、レコードが UNDO ログに挿入されます。この時点で、UNDO ログ バージョン チェーンの最初のレコードの DB_TRX_ID は 3 です。 現在、tom という名前のレコードをクエリするトランザクション D があります。この時点で、スナップショット読み取りが有効になります。スナップショットは、トランザクションの開始時にクエリ操作によってトリガーされるデータ スナップショットです。ロック解除読み取りは、繰り返し読み取り分離レベルでのデフォルトのスナップショット読み取りです。スナップショット読み取りとは対照的に、現在の読み取りもあります。すべての更新操作は現在の読み取りです。スナップショット読み取り中に読み取りビューが生成されます。トランザクションがスナップショット読み取りを実行すると、データベースの現在のスナップショットが生成され、現在アクティブなトランザクションの ID が記録および維持されます。トランザクション ID は自動増分されるため、トランザクションが新しいほど ID が大きくなります。読み取りビューは可視性アルゴリズムに従っており、可視かどうかはある程度の判断が必要です。読み取りビューは、現在アクティブなトランザクション ID を記録するだけでなく、現在作成されている最大トランザクション ID も記録します。スナップショットを読み取るときは、読み取りビューと比較して可視性の結果を取得する必要があります。 読み取りビューでは、主に現在のトランザクションの ID とシステム内のアクティブなトランザクションの ID を比較します。比較ルールは次のとおりです。
可視性の結果が非表示の場合、比較のために、DB_ROLL_PTR を使用して、UNDO ログからレコードの DB_TRX_ID を取得する必要があります。特定の条件を満たす DB_TRX_ID が見つかるまでバージョン チェーンをトラバースすると、この DB_TRX_ID を持つ古いレコードが、現在のトランザクションが確認できる最新の古いバージョンになります。 上記はMySQL MVCCメカニズム原理の詳細な説明の詳細な内容です。MySQL MVCCメカニズム原理の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: IIS web.config でクロスドメイン アクセスを設定する方法
1. Busyboxのソースコードをオンラインでダウンロードしてください。コンパイル方法については、...
序文この記事は私自身の製作過程の簡単な記録です。練習中に質問があれば、一緒に話し合うことができます。...
目次順序1. 集中ルーティング2. ファイルディレクトリ3. CompileRouterを作成する4...
この記事では、gearman+mysql メソッドを使用して永続化操作を実装します。ご参考までに、詳...
JSON 形式のフィールドは、MySQL 5.7 で追加された新しい属性ですが、基本的には文字列とし...
Dockerfile では、run、cmd、entrypoint はすべてコマンドを実行するために使...
目次概要1. グローバル登録2. 現地登録3. モジュールシステムへのローカル登録概要コンポーネント...
Vue+iview メニューとタブのリンク現在、vue+iview を使用してバックエンド管理システ...
序文Tomcat 内のすべてのリクエストは Servlet によって処理され、静的リソースも例外では...
システム提供のMySQLをアンインストールする1. MySQLがシステムにインストールされているかど...
1. 環境整備各コンテナの IP アドレス: nginx: 172.16.10.10マイSQL: 1...
pymysqlをインストールするpip install pymysql 2|0pymysqlの使用2...
ModSecurity は、Web サーバーに入るすべてのパケットをチェックする強力なパケット フィ...
目次概要1. パスモジュール2. モジュールまで3. fsモジュール4. イベントモジュール5. h...
目次予備的注釈問題の再現データ削除の原則データの再利用どの操作がデータホールの原因になりますか?表領...