MySQL マルチバージョン同時実行制御 MVCC の実装

MySQL マルチバージョン同時実行制御 MVCC の実装

トランザクション分離レベルの設定

グローバルトランザクション分離レベルを読み取りコミット済みに設定; //グローバルセッショントランザクション分離レベルを読み取りコミット済みに設定; //現在のセッション

トランザクションの送信方法を変更する(自動的に送信するかどうか、MySQL はデフォルトで自動的に送信します)

SET AUTOCOMMIT = 1; // 自動的にコミット、0 手動でコミット

異なるデータベース エンジンには異なる MVCC モードがあり、通常は楽観的同時実行制御と悲観的同時実行制御です。

インノDB

例:

InnoDB の MVCC は、レコードの各行の後に 2 つの隠し列を保存することによって実装されます。これら 2 つの列の 1 つは行の作成時刻を格納し、もう 1 つは行の有効期限 (または削除時刻) を格納します。もちろん、保存されるのは実際の時間値ではなく、システムのバージョン番号です。新しいトランザクションが開始されるたびに、システムのバージョン番号は自動的に増加します。トランザクション開始時のシステムバージョン番号は、照会されたバージョン番号と比較するためのトランザクションバージョン番号として使用されます。

選択

InnoDB は各行を次の 2 つの条件と照合します。

a. InnoDB は、現在のトランザクション バージョンよりも前のバージョンのデータ行のみを検索します (つまり、行のシステム バージョン番号がトランザクションのシステム バージョン番号以下です)。これにより、トランザクションによって読み取られる行は、トランザクションの開始前に存在していたか、トランザクション自体によって挿入または変更されたことが保証されます。

b. 削除された行のバージョンは未定義であるか、現在のトランザクション バージョン番号より大きいです。これにより、トランザクションによって読み取られた行が、トランザクションの開始前に削除されていないことが保証されます。

上記の 2 つの条件を満たすレコードのみがクエリ結果として返されます。

入れる

InnoDB は、新しく挿入された各行の行バージョン番号として現在のシステム バージョン番号を保存します。

消去

InnoDB は、削除された各行の行削除識別子として現在のシステム バージョン番号を保存します。

アップデート

InnoDB は、新しい行を挿入するときに現在のシステム バージョン番号を行バージョン番号として保存し、行削除マーカーとして元の行に現在のシステム バージョン番号を保存します。

知らせ:

MVCC は、REPEATABLE READ および READ COMMITED 分離レベルでのみ機能します。他の 2 つの分離レベルは MVCC と互換性がありません。READ UNCOMITTED では、現在のトランザクション バージョンに準拠するデータ行ではなく、常に最新のデータ行が読み取られるためです。 SERIALIZABLE はすべての読み取り行をロックします。

テーブルの状態を確認する

'task' のようなテーブル ステータスを表示します\G;

ダーティリード、非反復リード、ファントムリード

ダーティ リード: 現在のトランザクションは別のトランザクションのコミットされていない状態を読み取りますが、トランザクションは分離されていません。

反復不可能な読み取り: トランザクションの分離は達成されますが、同じデータが 2 回読み取られるとデータの不整合が見つかります。

ファントム リード: 同じデータ バッチを 2 回クエリすると、新しいデータが挿入されたことがわかります。これは主に、他のトランザクションがデータ セットの途中でデータを挿入したためです。 (ギャップロックを追加するとこの問題は解決します)

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQLのMVCCマルチバージョン同時実行制御の実装
  • MySQL マルチバージョン同時実行制御メカニズム (MVCC) ソースコードの詳細な説明
  • MySQL マルチバージョン同時実行制御 MVCC の詳細な研究
  • MySQL マルチバージョン同時実行制御 MVCC の基本原理の分析
  • MySQL マルチバージョン同時実行制御 MVCC の実装
  • Mysql MVCC マルチバージョン同時実行制御の詳細

<<:  MySQLにおける分散ロックの考え方をDBの助けを借りて詳しく説明します

>>:  Nginx セッション共有問題の解決策の分析

推薦する

MySQLクエリ最適化プロセスを理解する

目次パーサーとプリプロセッサクエリオプティマイザーMySQL クエリの最適化には、解析、前処理、最適...

Linux ネットワークプログラミング機能の簡単な分析

目次1.ソケットを作成する2. ソケットをバインドする3. 聞き手を作る。聞く4. 接続が受け入れら...

HTML で色を表すには、6 桁の 16 進コード、RGB、またはキーワードを使用します。

HTML で色を表す方法は 3 つありますが、最もよく使われるのは 6 桁の 16 進コード表現です...

React-Native スクリーンショットコンポーネント react-native-view-shot の紹介と使い方のまとめ

目次1. 現象2. 解決策3. 要約: 1. 現象1. 要件: 特定の表示ページをキャプチャしてアル...

HTMLの基礎を詳しく解説(第2部)

1. リストリスト ulコンテナーには、一貫した構造とスタイルを持つテキストまたはグラフの形式が読...

Vue 開発プロジェクトで Font Awesome 5 を使用する方法

目次依存関係をインストールする構成使用1.アイコン検索ページに入る2. 使用したいアイコンの英語名を...

MySQL で最大接続数を正しく変更する 3 つの方法

MySQL データベースをインストールすると、デフォルトの MySQL データベースの最大接続数が ...

Windows10でmysql8.0.17を置き換える詳細なチュートリアル

この記事では、Windows10でmysql8.0.17を置き換える具体的な手順を参考までに紹介しま...

MySQL の冗長インデックスと重複インデックスの詳細な説明

MySQL では、同じ列に複数のインデックスを作成できます。意図的であるかどうかにかかわらず、MyS...

MySQL の group by と order by を一緒に使用する方法

テーブル:reward(報酬テーブル)があるとします。テーブル構造は次のようになります。 テーブルt...

Windows での Nginx のインストールと環境設定 (nginx をサービスとして実行)

最初で最も重要なステップは、Windows 環境に Ngnix サービスをインストールする方法です。...

MySQLの暗黙的な変換問題の解決

1. 問題の説明 root@mysqldb 22:12: [xucl]> テーブル t1\G ...

lastInfdexOf 関数の MySQL 実装例

MySQL では lastIndexOf に似た関数を使用する必要がある場合もありますが、すぐに使用...

ラベルとスパンの幅設定が無効である問題の解決

デフォルトでは、ラベルとスパンの幅の設定は無効です。一般的に、表示属性は必須ですコードをコピーコード...

ApacheBench でマルチ URL をサポートする方法

標準の ab は単一の URI でのストレス テストのみをサポートしており、実際のニーズを満たしてい...