Maison >base de données >tutoriel mysql >Comment résoudre la lecture fantôme dans innoDB dans Mysql

Comment résoudre la lecture fantôme dans innoDB dans Mysql

WBOY
WBOYavant
2023-05-27 15:34:201731parcourir

1.Niveau d'isolement des transactions MySQL

Comment résoudre la lecture fantôme dans innoDB dans Mysql

Ces quatre niveaux d'isolement, lorsqu'il y a plusieurs conflits de concurrence de transactions, certains problèmes tels que des lectures sales, des lectures non répétables et des lectures fantômes peuvent survenir, et innoDB code>En mode de niveau d'isolement de lecture répétable, un problème de lecture fantôme est résolu <code>innoDB在可重复读隔离级别模式下解决了幻读的一个问题,

2. 什么是幻读

幻读是指在同一个事务中,前后两次查询相同范围的时候得到的结果不一致

Comment résoudre la lecture fantôme dans innoDB dans Mysql

如图,第一个事务里面,我们执行一个范围查询,这个时候满足条件的数据只有一条,而在第二个事务里面,它插入一行数据并且进行了提交,接着第一个事务再去查询的时候,得到的结果比第一次查询的结果多出来一条数据,注意第一个事务的第一次和第二次查询,都在同一个事物里面,所以,幻读会带来数据一致性的问题

3. InnoDB如何解决幻读的问题

InnoDB引入间隙锁next-key lock机制去解决幻读问题

Comment résoudre la lecture fantôme dans innoDB dans Mysql

假如现在存在这样一个B+Tree的索引结构,这个结构有4个索引元素,分别是1,4,7,10 当我们通过主键索引查询一条记录,并且对这条记录通过for update加锁的时候

Comment résoudre la lecture fantôme dans innoDB dans Mysql

这个时候会产生一个记录锁,也就是行锁,锁定id=1这个索引

Comment résoudre la lecture fantôme dans innoDB dans Mysql

被锁定的记录在锁释放之前,其他事务无法对这一条记录做任何操作的,前面我们所过对幻读的定义,幻读是指在同一个事务中,前后两次查询相同范围的时候得到的结果不一致,注意这里敲掉的是范围查询,也就是说要解决幻读的问题,必须保证一个点

Comment résoudre la lecture fantôme dans innoDB dans Mysql

就是如果一个事务通过这样一条语句进行锁定的时候,另外一个事务再执行

Comment résoudre la lecture fantôme dans innoDB dans Mysql

这样一条insert语句需要被阻塞,直到前面获得所的事务被释放,所以在innonDB设计一种间隙锁,它的主要功能是锁定一定范围内的索引记录

Comment résoudre la lecture fantôme dans innoDB dans Mysql

当对查询范围id > 4 and id 这个范围加锁的时候,会针对B+数中(4,7)这个开区间的范围加<code>间隙锁,意味着在这种情况下其他事务对这个区间的数据进行插入更新删除都会被锁住,但是还有另外一种情况,比如像这样

Comment résoudre la lecture fantôme dans innoDB dans Mysql

这条查询语句针对id > 4这个条件加锁,那么它需要锁定多个索引区间,所以这个情况下InnoDB引入一个叫next-key lock机制,next-key lock相当于间隙锁和记录锁的合集,记录锁锁定存在记录的行,间隙锁锁住的是记录行之间的间隙,而next-key lock锁住的是两者的和

Comment résoudre la lecture fantôme dans innoDB dans Mysql

每个数据行非唯一的索引列,都会存在一把next-key lock,当某个事务持有这一行数据的next-key lock的时候,会锁住一段在左开右闭区间的数据,因此当通过id > 4这样一个范围加锁的时候,InnoDB会去加一个next-key lock锁,锁定的区间范围是(4,7 ](7,10 ](10,+♾️ ]。间隙锁next-key lock的区别是在加锁的范围,间隙锁锁定的是两个索引之间的间隙,而next-key lock会锁定多个索引区间,它包含记录锁间隙锁当我们使用范围查询不仅仅命中Record记录,还包含了Gap间隙的时候,在这种情况下使用的就是临键锁,也就是next-key lock

2. Qu'est-ce que la lecture fantôme ? La lecture fantôme fait référence au résultat obtenu lorsque la même plage est interrogée deux fois dans la même transaction. 🎜Comment résoudre la lecture fantôme dans innoDB dans Mysql🎜🎜tel que Figure , dans la première transaction, nous exécutons une requête de plage. À ce stade, il n'y a qu'un seul élément de données qui remplit la condition. Dans la deuxième transaction, il insère une ligne de données et la soumet à nouveau. , le résultat obtenu est une donnée de plus que le résultat de la première requête. Notez que la première et la deuxième requête de la première transaction sont toutes deux dans la même chose, donc une lecture fantôme entraînera des problèmes de cohérence des données 🎜🎜3. Comment InnoDB résout le problème de la lecture fantôme🎜🎜InnoDB introduit les mécanismes gap lock et next-key lock pour résoudre le problème de la lecture fantôme🎜🎜Comment résoudre la lecture fantôme dans innoDB dans Mysql🎜🎜Supposons qu'il existe une telle structure d'index B+Tree maintenant, cette structure comporte 4 éléments d'index, à savoir 1, 4, 7, 10. Lorsque nous interrogeons un enregistrement via l'index de clé primaire et verrouillons l'enregistrement via pour mise à jour🎜🎜Comment résoudre la lecture fantôme dans innoDB dans Mysql🎜🎜Un verrouillage d'enregistrement sera généré à ce moment-là, c'est-à-dire, verrouiller la ligne, verrouiller l'index id=1🎜🎜Comment résoudre la lecture fantôme dans innoDB dans Mysql🎜🎜Avant que le verrou ne soit libéré, les autres transactions ne peuvent effectuer aucune opération sur l'enregistrement verrouillé. Comme nous l'avons déjà dit, la lecture fantôme signifie que dans la même transaction. , les résultats obtenus en interrogeant deux fois la même plage sont incohérents. Notez que la requête de plage est ici supprimée, ce qui signifie que pour résoudre le problème de la lecture fantôme, un point doit être garanti🎜🎜Comment résoudre la lecture fantôme dans innoDB dans Mysql🎜🎜C'est-à-dire si une transaction est verrouillée via une telle instruction Quand , une autre transaction est exécutée🎜🎜Comment résoudre la lecture fantôme dans innoDB dans Mysql 🎜🎜 Une telle instruction d'insertion doit être bloquée jusqu'à ce que la transaction obtenue précédemment soit libérée, donc un gap lock est conçu dans innonDB. Sa fonction principale est de verrouiller les enregistrements d'index dans une certaine plage 🎜🎜. Comment résoudre la lecture fantôme dans innoDB dans Mysql🎜🎜Lors de l'interrogation Lorsque le id > 4 et id est verrouillé, un gap lock sera ajouté à la plage de l'intervalle ouvert (4, 7) dans le numéro B+. Cela signifie que dans ce cas, les autres transactions qui insèrent, mettent à jour ou suppriment les données de cette plage seront verrouillées, mais il existe une autre situation, comme celle-ci 🎜🎜Comment résoudre la lecture fantôme dans innoDB dans Mysql🎜🎜Cette instruction de requête ajoute la condition id > 4 lock , alors il doit verrouiller plusieurs plages d'index, donc dans ce cas InnoDB introduit un mécanisme appelé next-key lock, next-key lock est équivalent au verrouillage d'espacement et au verrouillage d'enregistrement Une collection d'enregistrements, le verrouillage d'enregistrement verrouille les lignes où l'enregistrement existe, le verrouillage d'espacement verrouille l'espace entre les lignes d'enregistrement et le verrouillage de la touche suivante verrouille la somme des deux🎜🎜Comment résoudre la lecture fantôme dans innoDB dans Mysql🎜🎜Colonne d'index non unique pour chaque ligne de données, il y aura un verrouillage de la clé suivante Lorsqu'une transaction détient le verrouillage de la clé suivante de cette ligne de données, elle verrouillera une section qui s'ouvre sur. à gauche et se ferme à droite des données d'intervalle, donc lors du verrouillage à travers une plage telle que id > 4, InnoDB ajoutera un verrou next-key lock, et le la plage d'intervalles verrouillés est ( 4,7](7,10](10,+♾️]. La différence entre gap lock et next-key lock est la plage de verrouillage gap lock verrouille l'espace entre deux index et next. -key lock verrouillera plusieurs plages d'index, ce qui inclut le record lock et le gap lock. Lorsque nous utilisons la requête de plage, elle n'atteindra pas seulement l'enregistrement. lorsque l'écart Gap est également inclus, dans ce cas, le verrouillage de la clé suivante est utilisé, c'est-à-dire verrouillage de la clé suivante qui est l'algorithme de verrouillage de ligne par défaut dans Mysql🎜

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer