この記事では、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-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)
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)
snapshot read で、もう 1 つは current read です。 。 通常のクエリ ステートメントのみがスナップショット読み取りですが、残りの追加、削除、変更、および共有モードの共有ロックまたは更新用の排他ロックを使用したクエリ ステートメントはすべて、その時点で読み取られる最新の読み取りになります。スナップショットの読み取りは必ずしも最新のデータを読み取るわけではありません。
これは次のことから推測できます。セッション A で条件 name=John を指定して更新または削除する場合、以下に示すように、更新または削除は確実に成功しません。 isolate レベルがRead Commited
に変更されると、セッション A のクエリ ステートメントは、共有モードまたは更新用のロックを追加せずに、セッション B で変更および送信された最新のコンテンツをクエリできます。不可能と呼ばれます。 を繰り返し読んでください。これを書いていて、ちょっとした質問があります。non-repeatable reading と phantom reading は矛盾していますか? 答え: いいえ、non-repeatable reading は主に修正用であり、phantom reading は主に修正用です。主に挿入と削除用です。
以上がMysql Innodb トランザクション分離レベルとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。