Heim  >  Artikel  >  Datenbank  >  So lösen Sie Phantomlesungen in innoDB in MySQL

So lösen Sie Phantomlesungen in innoDB in MySQL

WBOY
WBOYnach vorne
2023-05-27 15:34:201694Durchsuche

1.Mysql-Transaktionsisolationsstufe

So lösen Sie Phantomlesungen in innoDB in MySQL

Diese vier Isolationsstufen können auftreten, wenn es zu Konflikten mit mehreren Transaktionen kommt Lesen, nicht wiederholbares Lesen und Phantomlesen, und innoDB löst ein Problem des Phantomlesens im wiederholbaren Leseisolationsstufenmodus, innoDB在可重复读隔离级别模式下解决了幻读的一个问题,

2. 什么是幻读

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

So lösen Sie Phantomlesungen in innoDB in MySQL

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

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

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

So lösen Sie Phantomlesungen in innoDB in MySQL

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

So lösen Sie Phantomlesungen in innoDB in MySQL

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

So lösen Sie Phantomlesungen in innoDB in MySQL

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

So lösen Sie Phantomlesungen in innoDB in MySQL

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

So lösen Sie Phantomlesungen in innoDB in MySQL

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

So lösen Sie Phantomlesungen in innoDB in MySQL

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

So lösen Sie Phantomlesungen in innoDB in MySQL

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

So lösen Sie Phantomlesungen in innoDB in 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 Was ist Phantomlesen#🎜 🎜##🎜🎜#Phantomlesung bedeutet, dass in derselben Transaktion die Ergebnisse, die bei zweimaliger Abfrage desselben Bereichs erzielt werden, inkonsistent sind#🎜🎜##🎜🎜#So lösen Sie Phantomlesungen in innoDB in MySQL#🎜🎜##🎜🎜#Wie im Bild gezeigt, führen wir in der ersten Transaktion eine aus Zu diesem Zeitpunkt gibt es nur ein Datenelement, das die Bedingungen erfüllt. Bei der zweiten Transaktion wird eine Datenzeile eingefügt und dann erneut abgefragt Es gibt ein zusätzliches Datenelement im Abfrageergebnis. Beachten Sie, dass die erste und zweite Abfrage dasselbe sind. Daher führt das Phantomlesen zu Datenkonsistenzproblemen. 3. Wie InnoDB das Problem des Phantomlesens löst#🎜🎜##🎜🎜#InnoDB führt die Mechanismen gap lock und next-key lock ein, um das Problem des Phantomlesens zu lösen #🎜🎜# #🎜🎜#So lösen Sie Phantomlesungen in innoDB in MySQL#🎜🎜 ##🎜🎜#Angenommen, es gibt eine solche B+Tree-Indexstruktur. Diese Struktur hat 4 Indexelemente, nämlich 1, 4, 7, 10. Wenn wir einen Datensatz über den Primärschlüsselindex abfragen, übergeben wir ihn für AktualisierungBeim Sperren#🎜🎜##🎜🎜#„So#🎜🎜##🎜🎜#Zu diesem Zeitpunkt wird eine Datensatzsperre generiert, bei der es sich um eine Zeilensperre handelt, die id=1 sperrt index#🎜🎜 ##🎜🎜#So lösen Sie Phantomlesungen in innoDB in MySQL #🎜 🎜##🎜🎜#Bevor die Sperre aufgehoben wird, können andere Transaktionen keine Vorgänge für den gesperrten Datensatz ausführen. Wie oben erwähnt, bezieht sich das Phantomlesen auf zwei Zeiten in derselben Transaktion. Bei der Abfrage desselben Bereichs , die erhaltenen Ergebnisse sind inkonsistent. Beachten Sie, dass es sich hier um die Bereichsabfrage handelt, was bedeutet, dass zur Lösung des Problems des Phantomlesens ein Punkt garantiert werden muss #🎜🎜##🎜🎜#So lösen Sie Phantomlesungen in innoDB in MySQL#🎜🎜##🎜🎜#Das heißt, wenn a Die Transaktion übergibt eine solche Anweisung. Beim Sperren wird eine weitere Transaktion ausgeführt =" So lösen Sie Phantomlesungen in innoDB in Mysql" />#🎜🎜##🎜🎜#Eine solche Einfügeanweisung muss blockiert werden, bis die zuvor erhaltene Transaktion freigegeben wird. Entwerfen Sie daher eine LückensperreinnonDB >, seine Hauptfunktion besteht darin, Indexdatensätze innerhalb eines bestimmten Bereichs zu sperren #🎜🎜##🎜🎜#So lösen Sie Phantomlesungen in innoDB in Mysql#🎜🎜##🎜🎜#Wenn der Abfragebereich id > 4 und id gesperrt ist, wird A gap lock wird zum Bereich des offenen Intervalls (4, 7) in der B+-Nummer hinzugefügt, was bedeutet, dass in diesem Fall andere Transaktionen, die die Daten in diesem Intervall einfügen, aktualisieren und löschen, dies tun gesperrt sein, aber es gibt eine andere Situation, wie diese#🎜🎜##🎜🎜#„So#🎜🎜##🎜🎜#Diese Abfrageanweisung sperrt die Bedingung id >, dann müssen mehrere Indexintervalle gesperrt werden In diesem Fall führt InnoDB einen Mechanismus namens next-key lock ein, der einer Sammlung von Lückensperren und Datensatzsperren entspricht, die Zeilen sperren, in denen Datensätze vorhanden sind und Lücken Die Sperre sperrt die Lücke zwischen den Datensatzzeilen und next-key lock sperrt die Summe der beiden #🎜🎜##🎜🎜#So lösen Sie Phantomlesungen in innoDB in MySQL#🎜🎜##🎜🎜#Nicht eindeutige Indexspalte für jede Datenzeile, Es wird eine Next-Key-Sperre geben. Wenn eine Transaktion die Next-Key-Sperre dieser Datenzeile enthält, wird ein Abschnitt gesperrt, der sich auf der linken Seite öffnet und schließt auf der rechten Seite. Wenn Sie also einen Bereich wie id > 4 sperren, fügt InnoDB eine Next-Key-Sperre hinzu und der gesperrte Intervallbereich ist ( 4,7](7,10](10,+♾️]. Der Unterschied zwischen gap lock und next-key lock ist der Sperrbereich, in dem gap lock die Lücke zwischen zwei Indizes sperrt -key lock sperrt mehrere Indexbereiche, einschließlich record lock und gap lock. Wenn wir die Bereichsabfrage verwenden, wird nicht nur der Record-Datensatz erreicht. Wenn auch die Gap-Lücke enthalten ist, wird in diesem Fall die Next-Key-Sperre verwendet, d. h. Next-Key-Sperre, der Standard-Zeilensperralgorithmus in MySQL

Das obige ist der detaillierte Inhalt vonSo lösen Sie Phantomlesungen in innoDB in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen