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

推薦する

Vue.jsはElement-uiを使用してナビゲーションメニューを実装します

この記事では、Element-uiを使用してvue.jsでナビゲーションメニューを実装するための具体...

MySQLデータベース監視binlogを有効にする手順

序文多くの場合、ユーザーが自分のデータに対して実行する操作に基づいて何かを行う必要があります。たとえ...

vue-router 4 の使用例の詳しい説明

目次1. インスタンスをインストールして作成する2. vue-router4の新機能2.1 動的ルー...

JS の querySelector メソッドと getElementById メソッドの違い

目次1. 概要1.1 querySelector() と querySelectorAll() の使...

Node.js における npx コマンドの使用法とシナリオ分析

npx 使用チュートリアル今晩、 Vue-Cli勉強していたところ、ふと最新の@4.xxバージョンを...

phpstudy から Linux への MySQL の移行に関するチュートリアル

プロジェクトの目的元のWindows環境でphpstudyを使用して構築されたMySQL 5.5.5...

Linux で推奨される 9 つの優れたコード比較ツールの概要

コードを書くとき、2 つのファイル間の違い、または同じファイルの異なるバージョン間の違いを知る必要が...

関数の分類の詳細な説明とJavascriptでのこのポイントの例

JS で関数を定義する 3 つの方法例を挙げて説明しましょう。 <スクリプト> //メソ...

Dockerはコンテナ外のコンテナ内でコマンドを実行します

コンテナ内でコマンドを実行したいが、コンテナに入りたくない場合があります。ではどうすればいいでしょう...

MySQL における Decimal 型と Float Double 型の違い (詳細説明)

MySQL には、10 進数などの標準データ型だけでなく、float や double などの非標...

ウェブデザインにおける装飾要素の応用の概要

<br />序文: このチュートリアルを読む前に、序文を注意深く読んでください。そうしな...

vue プロジェクトのデプロイと Nginx でのプロキシ設定の問題の分析

1. nginxをインストールして起動する # nginxをインストールする sudo apt-ge...

Mac に mysql5.7 をインストールするための完全な手順 (画像とテキスト付き)

最近、Mac システムを使用して、ローカル Web サーバー環境を構築する準備をしていました。 Ma...

MySQL エラー「すべての派生テーブルには独自のエイリアスが必要です」の解決方法

MySQL は、マルチテーブルクエリを実行するときにエラーを報告します。 [SQL] SELECT ...

シンプルで簡単なJavaScript開発のためのSvelte実装原理の詳細な説明

目次デモ1フラグメントの作成スヴェルトコンポーネント状態を変更できるデモSvelte は長い間存在し...