Le contenu de cet article est de vous présenter quel est le niveau d'isolation des transactions Mysql Innodb ? Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.
Mysql a quatre niveaux d'isolation des transactions, comme suit :
1. Lecture non validée : il permet de lire des données sales qui ont été modifiées mais non validées par d'autres transactions, et entraînera également des problèmes de lecture non reproductible et de lecture fantôme.
2. Lecture validée : Cela peut éviter de lire des données sales, mais cela causera toujours des problèmes de lecture non répétable et de lecture fantôme .
3. REPEATABLE-READ : le niveau d'isolement par défaut de Mysql provoquera des lectures fantômes Cependant, MySQL utilise la lecture de cohérence MVCC à ce niveau et ne générera pas de lectures fantômes. .
4. Sérialisable : Le niveau d'isolement le plus élevé, ce qui évitera les problèmes ci-dessus
Vous pouvez utiliser la méthode suivante pour vérifier le niveau d'isolement du système actuel
mysql> select @@global.tx_isolation,@@tx_isolation; +-----------------------+-----------------+ | @@global.tx_isolation | @@tx_isolation | +-----------------------+-----------------+ | REPEATABLE-READ | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec)
Sérialisable : Le niveau d'isolement le plus élevé, ce qui évitera les problèmes ci-dessus
Vous pouvez utiliser la méthode suivante pour vérifier le niveau d'isolement du système actuel#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)
Lecture non validée
LECTURE-UNCOMMITTEDExemple de lecture sale et de lecture non répétable :
À ce moment, session A lit les données modifiées mais non validées de la session B Data, si la session B revient en arrière à ce moment, les données lues par A seront invalides, ce qui est des "données sales", car les données lues par A pour la première fois sont différentes des données lues pour la deuxième fois, c'est une "lecture non répétable" ; de la même manière, si de nouvelles données sont insérées dans B, de nouvelles lignes de données seront également lues dans cette transaction dans A, c'est une lecture fantôme.
#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)
Niveau d'isolement par défaut
REPEATABLE-READ:
Description :
La transaction dans la session A lit la table inno_tbl avec l'identifiant 2 Le champ de nom est John, et si la transaction dans la session B change le nom avec l'identifiant 2 dans inno_tbl en Lucy et le soumet, si la transaction dans A lit cette ligne de données plus tard, on constatera que si c'est directement Si vous utilisez la méthode select pour interroger, les données lues sont toujours les anciennes données, mais avec l'ajout d'un verrou partagé, les données réelles seront lues. Pourquoi ? Parce que dans le moteur innodb, les instructions d'ajout, de suppression, de modification et de requête de MySQL peuvent être divisées en deux types : l'une estmysql> update inno_tbl set name='张三' where name='John'; Query OK, 0 rows affected (0.00 sec) Rows matched: 0 Changed: 0 Warnings: 0 mysql> delete from inno_tbl where name='John'; Query OK, 0 rows affected (0.00 sec)
et l'autre est lecture actuelle. Seules les instructions de requête ordinaires sont des lectures d'instantanés, tandis que les ajouts, suppressions, modifications et instructions de requête restants avec un verrou en mode partage ou un verrou exclusif pour la mise à jour sont toutes des lectures actuelles. les dernières données, tandis que la lecture d'instantanés ne lit pas nécessairement les dernières données. On peut en déduire : lors de la mise à jour ou de la suppression dans la session A avec la condition name=John, la mise à jour ou la suppression ne réussira certainement pas, comme indiqué ci-dessous : Si vous modifiez le niveau d'isolement sur Lecture validée
, alors l'instruction de requête dans la session A peut interroger le dernier contenu qui a été modifié et soumis dans la session B sans ajouter de verrou en mode partage ou pour mise à jour. Cette situation est appelée. Lecture non répétable. Au moment où j'écris ceci, j'ai une petite question. La lecture non répétable et la lecture fantôme se contredisent-elles ? Réponse : Non, la lecture non répétable est principalement destinée à la modification, et la lecture fantôme ? la lecture est principalement destinée aux modifications.Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!