MySQLデータベースのトランザクション分離レベルの詳細な説明

MySQLデータベースのトランザクション分離レベルの詳細な説明

データベーストランザクション分離レベル

データベース トランザクションには、低から高まで 4 つの分離レベルがあります。

  1. コミットされていない読み取り: ダーティ リードが許可されます。
  2. コミットされた読み取り: ダーティ リードを防止します。これは最も一般的に使用される分離レベルであり、ほとんどのデータベースのデフォルトの分離レベルです。
  3. 繰り返し読み取り: ダーティ読み取りと繰り返し不可能な読み取りを防止できます。
  4. シリアル化可能: ダーティ リード、非反復リード、ファントム リードを防ぐことができますが、(トランザクションのシリアル化により) データベースの効率が低下します。

これら 4 つのレベルにより、ダーティ リード、非反復リード、ファントム リードの問題を 1 つずつ解決できます。

√: 出現する可能性がある ×: 出現しない

トランザクションレベルダーティリード繰り返し不可能な読み取りファントムリード
コミットされていない読み取り
コミットされた読み取り×
繰り返し読み取り× ×
シリアル化可能× × ×

注: 分離レベルのシナリオについては、主に複数のトランザクションが同時に実行される場合について説明します。

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

ダーティリード:

ダーティ リードとは、トランザクションがデータにアクセスしてデータを変更しているときに、この変更がデータベースに送信されていない場合に、別のトランザクションもそのデータにアクセスしてそのデータを使用することを意味します。

繰り返し不可能な読み取り:

トランザクション内で同じデータを複数回読み取ることを意味します。このトランザクションが終了する前に、別のトランザクションも同じデータにアクセスします。したがって、最初のトランザクションでの 2 回の読み取りでは、2 番目のトランザクションの変更により、最初のトランザクションによって 2 回読み取られたデータが異なる可能性があります。これは、トランザクションで 2 回読み取られるデータが異なることを意味するため、非反復読み取りと呼ばれます。 (つまり、同じデータの内容を読み取ることはできません)

ファントムリーディング:

トランザクションが独立して実行されない場合に発生する現象を指します。たとえば、最初のトランザクションがテーブル内のデータを変更し、この変更がテーブル内のすべてのデータ行に関係する場合などです。同時に、2 番目のトランザクションもテーブルに新しいデータ行を挿入して、このテーブル内のデータを変更します。すると、最初のトランザクションを操作しているユーザーが、まるで幻覚を見ているかのように、テーブル内に変更されていないデータ行がまだ残っていることに気付くことがあります。

例:

表面:

テーブル `cc_wsyw126_user_test_isolation_copy` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `password` varchar(64) NOT NULL,
 `age` int(11) NOT NULL,
 主キー (`id`)、
 キー `ix_age` (`age`)
)ENGINE=MyISAM デフォルト文字セット=utf8;

シミュレーションデータ:

`cc_wsyw126_user_test_isolation_copy` (`password`, `age`) に挿入します 
価値観 
('1', 1)、
('22)、
('3', 3)、
('4'、4);

最初のトランザクションA:

取引を開始する 
cc_wsyw126_user_test_isolation_copy (パスワード、年齢) の値 ('5',5) を挿入します
専念

2番目のトランザクションB:

取引を開始する 
cc_wsyw126_user_test_isolation_copy を更新し、年齢を 2 に設定し、パスワードを >='2' に設定します。
cc_wsyw126_user_test_isolation_copy から * を選択します。パスワードは '2' 以上です。
専念

再現手順:

トランザクション A の挿入ステートメントがトランザクション B の SELECT ステートメントの前、更新ステートメントの後にある限り、問題ありません。

MySQL InnoDB ストレージ エンジンは、マルチバージョン同時実行制御プロトコル (MVCC (Multi-Version Concurrency Control)) と、Repeatable Read (RR) 分離レベルでのファントム読み取りを防ぐための次のキー ロック戦略を実装しています。ファントム リードをテストする場合は、MyISAM を試してください。

クラスター化インデックス (主キー インデックス) に一意制約がある場合、InnoDB はデフォルトの次のキー ロックをレコード ロックにダウングレードします。

読んでいただきありがとうございます。お役に立てれば幸いです。このサイトをサポートしていただきありがとうございます。

以下もご興味があるかもしれません:
  • Innodb トランザクション分離レベルと MySQL のロックの関係に関するチュートリアル
  • MySQL の分離レベル、ロック、MVCC の紹介
  • MySQL トランザクション、分離レベル、ロックの使用例の分析
  • MySQLの4つの分離レベルについての深い理解
  • MySQL の 4 つのトランザクション分離レベルの詳細な説明と比較
  • MySQL の 4 つのトランザクション分離レベルの詳細な説明
  • Mysql トランザクション分離レベルの読み取りコミットの詳細な説明
  • MySQLの分離レベルとロックメカニズムの詳細な説明

<<:  Vue Elementのテーブルコンポーネントをカプセル化する方法

>>:  Nginx ログ管理の概要

推薦する

Vueはボールのスライディングクロス効果を実現します

この記事の例では、ボールのスライドとクロスの効果を実現するためのVueの具体的なコードを共有していま...

SQLベースのクエリステートメント

目次1. 基本的なSELECT文1. 指定されたフィールドをクエリする3. エイリアスを設定する4....

Linuxのアラーム機能の例の説明

Linuxアラーム機能の紹介上記のコード: #include <stdio.h> #in...

テーブルの最大幅と最小幅を設定する際の互換性の問題と解決策の詳細な説明

テーブル内の min-width と max-width プロパティの設定 <テーブル>...

CSSは親コンテナのdivをimg画像で埋め、コンテナのサイズに適応します。

ページに複数の画像を導入すると、画像のサイズがばらつくことがあります。しかし、それらを一貫したサイズ...

MySQL の列から行への変換のヒント (共有)

序文:多くのビジネス テーブルでは、歴史的またはパフォーマンス上の理由により、最初のパラダイムに違反...

将来最も成功する企業はテクノロジー企業でしょうか、それともデザイン企業でしょうか?

ムーアの法則はもはや適用されない2004年にフレックストロニクスがフロッグデザインを買収したのを皮切...

HTML+CSS+JavaScript でガールフレンド版のスクラッチ カードを作成します (一度見ればすぐに覚えられます)

誰もがスクラッチ チケットで遊んだことがあると思います。子供の頃、ポケットにお金が入るとすぐに友達に...

Vue3 で状態管理を実装するために provide を使用する方法

目次序文provide/inject を通じて Vuex 関数を実装する方法このプラグインをアプリケ...

mysql8.0.11 winx64 手動インストールと設定チュートリアル

まず、私の日常生活についてお話しします。MySQLの急速なアップデートにより、MySQLはバージョン...

MySQL 8.0 のインデックス スキップ スキャン

序文MySQL 8.0.13 では、インデックス スキップ スキャン (インデックス ジャンプ スキ...

Mysql | ワイルドカード(%、_ など)を使用したファジークエリの詳細な説明

ワイルドカードのカテゴリ: %パーセント ワイルドカード: 任意の文字が任意の回数出現できることを示...

Win10 に Tomcat サーバーをインストールし、環境変数を構成する詳細なチュートリアル (画像とテキスト)

目次JDKをダウンロードしてインストールするTomcat 圧縮パッケージをダウンロードTomcatの...

Ubuntuのインストール Matlab2020b の詳細なチュートリアルとリソース

目次1. リソースファイル2. インストール2.1 詳細な手順2.1.1 ディスクイメージのマウント...

CSSを使用して炎の効果を作成する方法

本文は以下から始まります。 123WORDPRESS.COM ダウンロード:純粋な CSS3 で超リ...