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コマンドの使用

推薦する

Dell R720 サーバーに Windows Server 2008 R2 をインストールする方法

注: この記事のすべての写真はインターネットから収集されたものであるため、DELL R720 サーバ...

どのような種類の MYSQL 接続クエリを知っていますか?

序文クエリ情報が複数のテーブルから取得される場合、クエリのためにこれらのテーブルを結合する必要があり...

ドロップダウンメニュー効果を実現するJavaScript

参考までに、JavaScriptを使用してドロップダウンメニューを実装します。具体的な内容は次のとお...

CSS3はグラフィックの落下アニメーション効果を実現します

まずは効果を確認実装コード <div class="box box1"&g...

MySQLとRedisキャッシュ間の同期ソリューションについての簡単な説明

目次1. ソリューション 1 (UDF)デモケース2. ソリューション2(binlogの解析)キャナ...

Linux で圧縮ファイルの内容を表示する 10 の方法 (要約)

一般的に、アーカイブされたファイルや圧縮されたファイルの内容を表示するには、まず解凍してから表示する...

Dockerfile echoは、指定されたファイル内の複数行のテキストを実装する方法を指定します。

Dockerfile内の指定されたファイルに複数の行を追加します。echoの後の「$」記号に注意し...

Linuxでのcrontabの使い方と注意点の詳しい説明

Crontab は定期的な実行を設定するために使用されるコマンドです。そのデーモン プロセスは cr...

Webデザイン講座(4):素材と表現について

<br />前回のWebデザインチュートリアル:Webデザインチュートリアル(3):デザ...

UDP シンプル サーバー クライアント コード例

UDP の理論については詳しく説明しません。UDP に関する HelloWorld プログラムを紹介...

Vue.js アプリケーションのパフォーマンス最適化分析 + ソリューション

目次1. はじめに2. Vue JS のパフォーマンス最適化が必要な理由は何ですか? 3. Vueの...

CSS でのナビゲーション バーとドロップダウン メニューの実装

1. CSSナビゲーションバー(1)ナビゲーションバーの機能ナビゲーション バーを使いこなすことは、...

sshとは何ですか?使い方は?どのような誤解があるのでしょうか?

目次序文SSHとは何かssh は何に使用されますか? sshの使い方ssh 再修正要約する序文ssh...

設計仕様に準拠した設計は良い設計でしょうか?

これまでの数年間、私はいわゆる「設計仕様」についてかなりの数の執筆やコンサルティングを行ってきました...

CentOS システムのディスク パーティションを拡張する方法

問題/障害/シナリオ/要件Eve-ng の仮想マシン OVA のハードディスクは 38G しかないた...