ホームページ > データベース > mysql チュートリアル > Mysql Innodb トランザクション分離レベルとは何ですか?

Mysql Innodb トランザクション分離レベルとは何ですか?

青灯夜游
リリース: 2019-02-26 11:42:44
転載
1887 人が閲覧しました

この記事では、Mysql Innodb トランザクション分離レベルとは何かについて説明します。困っている友人は参考にしていただければ幸いです。

Mysql には、次の 4 つのトランザクション分離レベルがあります。

1. Read Uncommitted: 変更されたが他のトランザクションによってコミットされていないダーティ データを読み取ることができます。 non-repeatable read および ファントム read の問題も発生します。

2. Read Committed: ダーティ データの読み取りを回避できますが、non-repeatable read および ファントム read の問題が発生します。

3. REPEATABLE-READ: Mysql のデフォルト分離レベルでは ファントム読み取り が発生します。ただし、mysql はこのレベルで MVCC 一貫性読み取りを使用し、ファントム読み取りを生成しません。 。

4. Serializable: 上記の問題を回避する最高の分離レベル。

次の方法を使用して、現在のシステムの分離レベルを確認できます。 ##

mysql> select @@global.tx_isolation,@@tx_isolation;
+-----------------------+-----------------+
| @@global.tx_isolation | @@tx_isolation  |
+-----------------------+-----------------+
| REPEATABLE-READ       | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)
ログイン後にコピー
未コミット read

READ-UNCOMMITTED ダーティ リードと反復不能読み取りの例:

#session A
mysql> set session transaction isolation level read uncommitted;   #设置隔离级别为未提交读
Query OK, 0 rows affected (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from inno_tbl where id=2;
+----+------+
| id | name |
+----+------+
|  2 | John |
+----+------+
1 row in set (0.00 sec)
ログイン後にコピー
#session B
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update inno_tbl set name='Jack Ma' where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
ログイン後にコピー
#session A
mysql> select * from inno_tbl where id=2;
+----+---------+
| id | name    |
+----+---------+
|  2 | Jack Ma |
+----+---------+
1 row in set (0.00 sec)
ログイン後にコピー
この時点で、セッション A は、変更されたが送信されていないデータを読み取ります。セッション B。この時点でセッション B がロールバックすると、A が初めて読み取ったデータは 2 回目に読み取られたデータと異なるため、A が読み取ったデータは無効になります。これは「ダーティ データ」です。は「反復不可読み取り」です。同様に、新しいデータが B に挿入されると、A のこのトランザクションでも新しいデータ行が読み取られます。これはファントム読み取りです。

同じプロセスで、A の分離レベルを read commit に変更すると、「ダーティ リード」は発生しませんが、「非反復読み取り」と「ファントム リード」も発生します

デフォルトの分離レベル

REPEATABLE-READ下:

#session A
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from inno_tbl where id=2;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | John         |
+----+--------------+
1 row in set (0.00 sec)
ログイン後にコピー
#session B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update inno_tbl set name='Lucy' where id=2; 
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.03 sec)
ログイン後にコピー
#session A
mysql> select * from inno_tbl where id=2;
+----+--------------+
| id | name         |
+----+--------------+
|  2 | John         |
+----+--------------+
1 row in set (0.00 sec)
#注意,此时没有产生“不可重复读”问题,但若是为查询加上共享锁:
mysql> select * from inno_tbl1 where id=2 lock in share mode;
+----+---------+
| id | name    |
+----+---------+
|  2 | Lucy    |
+----+---------+
1 row in set (0.00 sec)
ログイン後にコピー
説明:

セッション A のトランザクションは、ID 2 の inno_tbl テーブルの名前フィールドが John であることを読み取ります。セッション B のトランザクションが inno_tbl の ID 2 の名前を Lucy に変更して送信した場合、後で A のトランザクションがこのデータ行を再度読み取ると、select メソッドを直接使用してクエリを実行すると、読み取り データは古いデータのままであり、共有ロックを使用すると、実際のデータが読み取られます。

理由は、innodb エンジンでは、mysql の add、delete、modify、および query ステートメントが 2 つのタイプに分類できるためです。1 つは

snapshot read で、もう 1 つは current read です。 。 通常のクエリ ステートメントのみがスナップショット読み取りですが、残りの追加、削除、変更、および共有モードの共有ロックまたは更新用の排他ロックを使用したクエリ ステートメントはすべて、その時点で読み取られる最新の読み取りになります。スナップショットの読み取りは必ずしも最新のデータを読み取るわけではありません。

これは次のことから推測できます。セッション A で条件 name=John を指定して更新または削除する場合、以下に示すように、更新または削除は確実に成功しません。 isolate レベルが

Read Commited

に変更されると、セッション A のクエリ ステートメントは、共有モードまたは更新用のロックを追加せずに、セッション B で変更および送信された最新のコンテンツをクエリできます。

不可能と呼ばれます。 を繰り返し読んでください。これを書いていて、ちょっとした質問があります。non-repeatable readingphantom reading は矛盾していますか? 答え: いいえ、non-repeatable reading は主に修正用であり、phantom reading は主に修正用です。主に挿入と削除用です。

以上がMysql Innodb トランザクション分離レベルとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート