MySQL 分離レベルの詳細な説明と例

MySQL 分離レベルの詳細な説明と例

物事の分離レベルは知っているが、一度も操作したことがない。

ダーティ リード: トランザクションがデータの一部を更新し、別のトランザクションがこの時点で同じデータを読み取ります。何らかの理由で、前のトランザクションが操作をロールバックしたため、後者のトランザクションによって読み取られたデータは不正確になります。

反復不可能な読み取り: トランザクション内の 2 つのクエリ間でデータが矛盾しています。これは、トランザクションが 2 つのクエリ間で元のデータを更新したことが原因である可能性があります。

ファントム リード: トランザクションの 2 つのクエリのデータ エントリ数が一致しません。たとえば、1 つのトランザクションが複数のデータ列をクエリし、別のトランザクションが同時に複数の新しいデータ列を挿入します。次のクエリでは、前のトランザクションが以前にはなかった複数のデータ列を見つけます。

MySQL の 4 つの分離レベル

コミットされていないデータの読み取り: コミットされていないデータを読み取る: どちらの問題も解決されない
コミットされたデータの読み取り: コミットされたデータの読み取り: ダーティリードを解決できます ---- Oracle のデフォルト
繰り返し読み取り: 再読み取り読み取り: ダーティリードと非繰り返し読み取りを解決できます - MySQL デフォルト
シリアル化可能: シリアル化: ダーティリード、非反復リード、仮想リードを解決できます。これはテーブルをロックするのと同等です。

トランザクション分離レベルダーティリード繰り返し不可能な読み取りファントムリード
読み取り未コミットはいはいはい
繰り返し不可能な読み取り (読み取りコミット)いいえはいはい
繰り返し読み取りいいえいいえはい
シリアル化可能いいえいいえいいえ

データ テーブルを作成します。

テーブル shuzhi を作成する
(
  id mediumint(8) 主キー、
  名前varchar(30),
  shuzhi mediumint(10)
);
テーブル shuzhi を変更します。engine=innodb;
shuzhi に値 (1,'aa',1000) を挿入します。
shuzhi に値 (2,'bb',2000) を挿入します。
shuzhi に値 (3,'cc',3000) を挿入します。
shuzhi に値 (4,'dd',4000) を挿入します。
shuzhi に値 (5,'ee',5000) を挿入します。
shuzhi に値 (6,'ff',6000) を挿入します。
shuzhi に値 (7,'gg',7000) を挿入します。
shuzhi に値 (8,'hh',8000) を挿入します。

トランザクションの4つの分離レベルのテストを開始します。最初のレベル: コミットされていない読み取り

分離レベルの設定

#現在の分離レベルを照会する SELECT @@tx_isolation
#分離レベルを設定する セッショントランザクション分離レベルを設定する [分離レベル]
セッショントランザクション分離レベルをコミットされていない読み取りに設定

まず最初のプロセスを開始し、まだクエリを実行せずにトランザクションを開始します。

ウィンドウ 1
トランザクションを開始します。

次に2番目のプロセス(ターミナル)を開きます
まずトランザクションを開いて、コミットせずにレコードを変更します

ウィンドウ 2
トランザクションを開始します。
shuzhi を更新します。id=7 の場合、shuzhi='8888' を設定します。

データベースにアクセスしてクエリを実行すると、id=7 の値がまだ 7000 であり、値は変更されていないことがわかります。

ここに画像の説明を挿入

このレコードを照会するにはウィンドウ 1 に移動します

ウィンドウ 1
トランザクションを開始します。
shuzhi から * を選択 (ID=7)

ここに画像の説明を挿入

読み取られたデータは7000ではなくウィンドウ2で送信されたデータであることが判明した。

これで、MySQL 分離レベルの詳細と例に関するこの記事は終了です。MySQL 分離レベルの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLの4つの分離レベルについての深い理解
  • MySQL の 4 つのトランザクション分離レベルの詳細な説明
  • MySQL 分離レベル操作プロセスの詳細説明 (cmd)
  • MySQL の 4 つのトランザクション分離レベルを例を使って分析する
  • MySQL トランザクション分離レベルの原則例分析
  • MySQLにおけるトランザクション分離レベルの実装原理の詳細な説明

<<:  Select はダブルクリック dbclick イベントをサポートしていません

>>:  CSS コンテナ背景 10 色グラデーション デモ (linear-gradient())

推薦する

ブロックレベル要素、インライン要素、可変要素の概要

ブロック要素p - 段落テキストの事前フォーマットテーブルol - ソートフォームul - 順序なし...

Docker コンテナを他のサーバーに移行する 5 つの方法

多くの場合、移行は避けられません。ハードウェアのアップグレード、データ センターの変更、古いオペレー...

HTML コードの書き方に関する提案のまとめ

リソースファイルのプロトコルを省略する画像、メディアファイル、スタイル、スクリプトの URL では、...

TypeScript マッピング型の詳細

目次1. マップされた型2. マッピング修飾子3. キーの再マッピング4. さらなる探究序文: Ty...

DockerコンテナにNFS共有ディレクトリをマウントする実装

以前、https://www.jb51.net/article/205922.htm で、Docke...

MySQL バージョンは、2 つのタイムスタンプ型の値をサポートしていないバージョンよりも低いです。

MySQL エラー:エラー コード: 1293 テーブル定義が正しくありません。CURRENT_T...

Zabbix設定 DingTalkアラーム機能実装コード

必要Zabbix で DingTalk アラームを設定する方法は、Prometheus で Ding...

Linux には make コマンドがありません (make: *** ターゲットが指定されておらず、makefile または make コマンドのインストール方法が見つかりません)

知らせ! ! !この状況は、実際には仮想マシンのインストール中に回避できます。次回仮想マシンをテスト...

Vueは3段階のナビゲーション表示と非表示を実装します

この記事では、3階層ナビゲーションの表示と非表示を実現するためのVueの具体的なコードを例として紹介...

Vue2.x と Vue3.x のルーティングフックの違いの詳細な説明

目次vue2.xプレコンセプト:ルーティングフックのカテゴリルーティングとコンポーネントの概念(フッ...

MySQL インデックスの長所と短所、およびインデックス作成のガイドライン

1. インデックスを作成する理由(メリット)インデックスを作成するとシステムのパフォーマンスが大幅に...

Vue における nextTick の役割といくつかの簡単な使用シナリオ

目的nextTickの役割といくつかの簡単な使用シナリオを理解する文章その機能は何ですか?遅延コール...

MySQL 8.0 バージョンで getTables がすべてのデータベース テーブルを返す問題の簡単な分析

序文この記事では、主にライブラリ内のすべてのテーブルを返すMysql8.0ドライバgetTables...

vue3 の setUp とリアクティブ関数の使用方法の詳細な説明

1. いつsetUpを実行するかvue3 ではメソッドを正常に使用できるようになったことは誰もが知っ...