MySql の 4 つのトランザクション分離レベルについて簡単に説明します。

MySql の 4 つのトランザクション分離レベルについて簡単に説明します。

分離レベル:

隔離はあなたが考えるよりも複雑です。 SQL 標準では 4 つの分離レベルが定義されており、これによって各トランザクションで行われた変更のうち、トランザクション内およびトランザクション間で表示されるものと表示されないものが決まります。一般的に、分離レベルが低いほど同時実行性が向上し、システムのオーバーヘッドが低くなります。

以下は、4 つの分離レベルについて簡単に紹介します。

1.READ UNCOMMITTED(非コミット読み取り)

READ UNCOMMITTED レベルでは、トランザクションで行われた変更は、コミットされていない場合でも、他のトランザクションに表示されます。 トランザクションはコミットされていないデータを読み取ることができます。これはダーティ リードとも呼ばれます。このレベルは多くの問題を引き起こす可能性があります。パフォーマンスの点では、READ UNCOMMITTED は他のレベルと比べてそれほど優れているわけではありませんが、他のレベルの利点の多くを欠いています。非常に必要な理由がない限り、実際のアプリケーションで使用されることはほとんどありません。

(1)すべてのトランザクションは、コミットされていない他のトランザクションの実行結果を見ることができる

(2)この分離レベルは、他のレベルと比べてパフォーマンスがそれほど優れていないため、実際のアプリケーションではほとんど使用されません。

(3)このレベルで発生する問題はダーティリードである。コミットされていないデータが読み込まれる。

#まず、分離レベルを変更します。set tx_isolation='READ-UNCOMMITTED';
@@tx_isolation を選択します。
+------------------+
| @@tx_isolation |
+------------------+
| 読み取り未コミット |
+------------------+#トランザクション A: トランザクションを開始します start transaction;
tx から * を選択します。
+------+------+
| ID | 番号 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+#トランザクション B: トランザクションも開始します (その後、2 つのトランザクションが交差します)
開始トランザクションをコミットせずにトランザクション B で更新ステートメントを実行します。
txを更新し、id=1の場合にnum=10を設定します。
tx から * を選択します。
+------+------+
| ID | 番号 |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+#トランザクション A: この時点でトランザクション A は更新されたデータを見ることができますか?
tx から * を選択します。
+------+------+
| ID | 番号 |
+------+------+
| 1 | 10 | ---> 見えますよ!これは、トランザクション B がまだコミットしていないデータを読み取ったことを意味します。 | 2 | 2 |
| 3 | 3 |
+------+------+#トランザクション B: トランザクション B はロールバックされますが、ロールバックはまだコミットされていません。
tx から * を選択します。
+------+------+
| ID | 番号 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+#トランザクション A: トランザクション A に表示されるデータは、B が送信していないデータでもあります。select * from tx;
+------+------+
| ID | 番号 |
+------+------+
| 1 | 1 | ---> ダーティ リードとは、トランザクション B がコミットされていないにもかかわらず、このトランザクション (A) 内でデータの変更を確認できることを意味します。
| 2 | 2 |
| 3 | 3 |
+------+------+

2.READ COMMITTED(コミットされた読み取り)

ほとんどのデータベース システムのデフォルトの分離レベルは READ COMMITTED ですが、MySQL はそうではありません。READ COMMITTED は、上記の分離の単純な定義を満たしています。つまり、トランザクションが開始されると、コミットされたトランザクションによって行われた変更のみが「確認」されます。 つまり、トランザクションが開始してからコミットされるまでの間に行われた変更は、他のトランザクションには表示されません。 このレベルは、同じクエリを 2 回実行すると異なる結果が生成される可能性があるため、非反復読み取りと呼ばれることもあります。

(1) これはほとんどのデータベースシステムのデフォルトの分離レベルです(ただしMySQLは除きます)。

(2)分離性の単純な定義を満たしている:トランザクションは、すでにコミットされたトランザクションによって行われた変更のみを見ることができる。

(3) この分離レベルの問題は、非反復読み取りです。非反復読み取りとは、同じトランザクションでまったく同じ選択ステートメントを実行したときに、異なる結果が表示される可能性があることを意味します。

原因としては以下が考えられます:

(1)新たなコミットを伴うクロストランザクションが発生し、データが変更される。

(2)データベースが複数のインスタンスによって操作される場合、このインスタンスの処理中に、同じトランザクションの他のインスタンスに新しいコミットが行われる可能性がある。

#まず分離レベルを変更します set tx_isolation='read-committed';
@@tx_isolation を選択します。
+----------------+
| @@tx_isolation |
+----------------+
| コミット読み取り |
+----------------+#トランザクション A: トランザクションを開始します start transaction;
tx から * を選択します。
+------+------+
| ID | 番号 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+#トランザクション B: トランザクションも開始します (その後、2 つのトランザクションが交差します)
このトランザクションではデータが更新され、開始トランザクションはコミットされません。
txを更新し、id=1の場合にnum=10を設定します。
tx から * を選択します。
+------+------+
| ID | 番号 |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+#トランザクション A: この時点でトランザクション A のデータの変更を確認できますか?
tx から * を選択します。 --------------->
+------+------+ |
| ID | 番号 | |
+------+------+ |
| 1 | 1 |--->見えません! |
| 2 | 2 | |
| 3 | 3 | |
+------+------+ |——>同じ選択ステートメントですが、結果は異なります|
#トランザクション B: トランザクション B がコミットされた場合はどうなりますか? |
コミット; |
|
#トランザクションA: |
tx から * を選択します。 --------------->
+------+------+
| ID | 番号 |
+------+------+
| 1 | 10 |--->トランザクション B がコミットされたため、トランザクション A のデータの変更を確認できます | 2 | 2 |
| 3 | 3 |
+------+------+

3. 繰り返し読み取り

REPEATABLE READ はダーティ リード問題を解決します。 このレベルでは、同じトランザクションで同じレコードを複数回読み取った結果の一貫性が確保されます。 ただし、理論的には、Repeatable Read 分離レベルでは、別の問題である Phantom Read を解決できません。いわゆるファントム リードとは、トランザクションが特定の範囲のレコードを読み取っているときに、別のトランザクションがその範囲内に新しいレコードを挿入する状況を指します。前のトランザクションがその範囲内のレコードを再度読み取ると、ファントム行が生成されます。InnoDB および XtraDB ストレージ エンジンは、マルチバージョン同時実行制御 (MVCC、Multiversion Concurrency Control) によってファントム リードの問題を解決します。

(1)これはMySQLのデフォルトのトランザクション分離レベルです

(2)同じトランザクションの複数のインスタンスが同時にデータを読み取るときに、同じ行を参照することを保証します。

(3) このレベルで発生する可能性のある問題 - ファントム読み取り: ユーザーがデータ行の範囲を読み取ると、別のトランザクションがその範囲に新しい行を挿入します。ユーザーがその範囲内のデータ行を再度読み取ると、新しいファントム行が見つかります。

(4) InnoDBとFalconストレージエンジンは、マルチバージョン同時実行制御(MVCC)メカニズムを通じてこの問題を解決します。

#まず、分離レベルを変更します。set tx_isolation='repeatable-read';
@@tx_isolation を選択します。
+-----------------+
| @@tx_isolation |
+-----------------+
| 繰り返し読み取り |
+-----------------+#トランザクション A: トランザクションを開始します start transaction;
tx から * を選択します。
+------+------+
| ID | 番号 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+#トランザクション B: 新しいトランザクションを開始します (その後、2 つのトランザクションが交差します)
トランザクション B でデータを更新し、開始トランザクションをコミットします。
txを更新し、id=1の場合にnum=10を設定します。
tx から * を選択します。
+------+------+
| ID | 番号 |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+
commit;#トランザクション A: トランザクション B がコミットされた場合でも、A はデータの変更を確認できますか?
tx から * を選択します。
+------+------+
| ID | 番号 |
+------+------+
| 1 | 1 | ---> まだ見えません! (これはレベル 2 とは異なり、レベル 3 では非反復読み取りの問題が解決されることも示しています)
| 2 | 2 |
| 3 | 3 |
+------+------+#トランザクション A: トランザクション A もコミットされた場合にのみ、データの変更がコミットされたことがわかります。
tx から * を選択します。
+------+------+
| ID | 番号 |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+

4.シリアル化可能

SERIALIZABLE は最高の分離レベルです。トランザクションを強制的にシリアルに実行することで、前述のファントム リードの問題を回避します。簡単に言うと、SERIALIZABLE は読み取られたデータの各行をロックするため、多くのタイムアウトやロック競合の問題が発生する可能性があります。 この分離レベルは、実際のアプリケーションではほとんど使用されません。データの一貫性を確保することが極めて必要であり、同時実行が許容されない場合にのみ考慮されます。

(1)これは最高の隔離レベルである

(2)トランザクションが互いに競合しないように強制的に順序付けすることでファントムリード問題を解決します。つまり、読み取られたデータの各行に共有ロックが追加されます。

(3)このレベルでは、多数のタイムアウトやロック競合が発生する可能性がある。

#まず分離レベルを変更します set tx_isolation='serializable';
@@tx_isolation を選択します。
+----------------+
| @@tx_isolation |
+----------------+
| シリアル化可能 |
+----------------+#トランザクション A: 新しいトランザクションを開始します。#トランザクション B: A がコミットされる前は、このクロストランザクションはデータを変更できません。開始トランザクション。
tx値を挿入します('4','4');
エラー 1205 (HY000): ロック待機タイムアウトを超えました。トランザクションを再起動してください。
txを更新し、id=1の場合にnum=10を設定します。
エラー 1205 (HY000): ロック待機タイムアウトを超えました。トランザクションを再起動してください。

上記は、MySql の 4 つの分離レベルの詳細についての簡単な説明です。MySQL の分離レベルの詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • MySQL トランザクション分離レベルの詳細
  • トランザクション分離レベルのMySQLケース分析
  • MySQL トランザクションと分離レベルの基本原理の簡単な分析

<<:  vue+openlayer をベースにマップの集約と散乱効果を実現

>>:  Linux lnコマンドの使用

推薦する

画像ソーシャルネットワーキングサイトのUIアプリケーションの比較分析(図)

私たちの生活、仕事、勉強において、ソーシャル ネットワークは徐々に将来のインターネット発展のトレンド...

CentOS7にJDK8をrpmモードでインストールする

CentOS 7が正常にインストールされると、OpenJDKのJREがデフォルトでインストールされて...

CSS スタイルにおける中国語フォントのフォントファミリーに対応する英語名の詳細な説明

ソングティ: SimSun太字: SimHeiマイクロソフト YaHei: マイクロソフト YaHe...

HTML CSS を使用して div またはテーブルを指定した位置に固定する方法

CSSコードコンテンツをクリップボードにコピー.bottomTable{背景色: rgb (249,...

カルーセル効果を作成するためのjs

カルーセルはフロントエンド開発において比較的重要なポイントだと思います。ネイティブjsの知識ポイント...

HTML テーブルタグチュートリアル (21): 行の境界線の色属性 BORDERCOLOR

テーブルを美しくするために、行ごとに異なる境界線の色を設定できます。基本的な構文<TR 境界線...

Angularルーティングアニメーションと高度なアニメーション機能の詳細な説明

目次1. ルーティングアニメーション2. グループクエリとスタガー1. ルーティングアニメーションル...

Vueプロジェクトをパッケージ化してリリースする手順

目次1. 開発環境から本番環境への移行2. 統一されたリクエストパスを設定する3. パッケージ化コマ...

NexusはHTTPSプロトコルをサポートするためにnginxプロキシを使用します

背景すべての会社の Web サイトは HTTPS プロトコルをサポートする必要があります。Aliba...

MYSQL から MARIADB へのプロジェクト移行に関するチュートリアル

データベース (MySQL) を準備します。すでに MySQL をお持ちの場合は、これを無視できます...

MySQL 8.0.11 のインストールと設定方法のグラフィック チュートリアル (win10)

この記事ではMySQL 8.0.11のインストールと設定方法を参考までに記録します。具体的な内容は以...

レスポンシブ Web デザイン手法を実装し、ウォーターフォール モデルに別れを告げる 5 つのステップ (グラフィック チュートリアル)

次の Web デザイン プロジェクトはレスポンシブにする必要があると上司をようやく納得させることがで...

IIS7~IIS8.5 サーバープロトコルヘッダーの削除または変更

要件: IIS 7、7.5、8.0、8.5、および ASP.NET で HTTP 応答ヘッダーを削除...

Webpack コンポーネントの使用状況統計を実装するための 50 行のコード

背景最近、リーダーからコンポーネント ライブラリを構築するように依頼があり、プロジェクトで現在使用さ...

データベースSQL文の最適化

最適化する理由:実際のプロジェクトが開始され、データベースが一定期間稼働した後、初期のデータベース設...