Beispielanalyse des Prinzips der MySQL-Transaktionsisolationsebene

Beispielanalyse des Prinzips der MySQL-Transaktionsisolationsebene

Einführung

Dies ist Ihnen sicherlich schon einmal in einem Vorstellungsgespräch begegnet.

Lassen Sie uns über die Isolationsstufe von Transaktionen sprechen.

Ehrlich gesagt ist die Frage nach der Transaktionsisolationsstufe etwas, was Interviewer gerne stellen, egal ob es sich um Campus-Rekrutierung oder Social-Rekrutierung handelt! Um ehrlich zu sein, bezweifle ich jedoch, dass die Autoren sie verstehen, nachdem ich viele Artikel im Internet gelesen habe! Denn ihre Analyse von wiederholbarem Lesen (Repeatable Read) und serialisierbarem Lesen (Serializable) verwirrt mich wirklich!

Darüber hinaus wird in vielen Büchern behauptet, dass wiederholbares Lesen das Phantomleseproblem löst, z. B. „MySQL Technology Insider – InnoDB Storage Engine“ usw., aber diese Bücher sind nicht einzeln aufgeführt. Daher sind die meisten Artikel zu Transaktionsisolationsebenen im Internet problematisch, daher werde ich einen weiteren Artikel schreiben, um dies zu erklären!

Der Großteil des Inhalts dieses Artikels wird von der offiziellen Website unterstützt. Daher können Sie sich nach dem Lesen dieses Artikels die Konzepte merken. Sofern das Entwicklungshandbuch auf der offiziellen Website nicht falsch ist, sollte es richtig sein!

Darüber hinaus konzentriert sich dieser Artikel auf

Löst Repeatable Read wirklich das Problem der Phantom-Lesevorgänge?

Text

Lassen Sie mich zunächst erwähnen, dass je nach Isolationsstufe der Transaktion drei Situationen auftreten können. Dazu gehören Dirty Read, nicht wiederholbares Lesen und Phantomlesen. Ich werde die Definitionen dieser drei Situationen hier nicht erwähnen, sie aber später hinzufügen, wenn ich über Isolationsebenen spreche.

Hierbei sollte jeder bedenken, dass gemäß den Definitionen von Dirty Read, Non-Repeatable Read und Phantom Read (selbstzusammenfassend, nicht auf der offiziellen Website verfügbar) die folgenden Einschlussbeziehungen bestehen:


Wie also ist dieses Bild zu verstehen?

Das heißt, wenn ein Dirty Read auftritt, kommt es zwangsläufig zu nicht wiederholbaren Lesevorgängen und Phantomlesevorgängen. Denn das Phänomen des Dirty Reads lässt sich durch nicht wiederholbare Reads und die Definition des Phantom Reads erklären. Andererseits lässt sich das Phänomen der nicht wiederholbaren Lesevorgänge möglicherweise nicht durch die Definition des „Dirty Read“ erklären!

Angenommen, es gibt eine Tabelle tx_tb wie folgt, pId ist der Primärschlüssel

Pi Name
1 zhangsan

1. Nicht festgeschriebene Daten lesen (READ_UNCOMMITTED)

Tatsächlich ist dies aus dem Namen der Isolation ersichtlich: Eine Transaktion kann die nicht festgeschriebenen Daten einer anderen Transaktion lesen! Zur Erklärung zeichne ich einfach ein Bild zur Veranschaulichung!

Wie in der Abbildung gezeigt, wurden die von einer Transaktion abgerufenen Daten von einer anderen, nicht festgeschriebenen Transaktion geändert.

Die von der offiziellen Website für Dirty Read definierte Adresse lautet

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_dirty_read

Sein Inhalt ist

**schmutzige Lektüre
Ein Vorgang, bei dem unzuverlässige Daten abgerufen werden, d. h. Daten, die durch eine andere Transaktion aktualisiert, aber noch nicht festgeschrieben wurden.
**

Übersetzt bedeutet es

Die aus der Operation abgerufenen Daten sind unzuverlässig und können durch eine andere nicht festgeschriebene Transaktion geändert werden!

Sie werden feststellen, dass die Ergebnisse unserer Demonstration mit der Definition von „Dirty Reads“ auf der offiziellen Website übereinstimmen. Gemäß unserer anfänglichen Argumentation müssen, wenn Dirty Reads existieren, nicht wiederholbare Reads und Phantom Reads existieren.

2. Lesen verpflichtet (READ_COMMITTED)

Dies zeigt auch, dass eine Transaktion die von einer anderen Transaktion übermittelten Daten lesen kann! Zur Erklärung zeichne ich einfach ein Bild zur Veranschaulichung!

Wie in der Abbildung gezeigt, können von einer Transaktion abgerufene Daten nur von einer anderen festgeschriebenen Transaktion geändert werden.

Die von der offiziellen Website definierte Adresse für nicht wiederholbares Lesen ist

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_non_repeatable_read

Sein Inhalt ist

**nicht wiederholbares Lesen
Die Situation, wenn eine Abfrage Daten abruft und eine spätere Abfrage innerhalb der gleichen Transaktion zwar dieselben Daten abruft, die Abfragen jedoch unterschiedliche Ergebnisse zurückgeben (geändert durch eine andere Transaktion, die in der Zwischenzeit einen Commit ausgeführt hat).
**

Übersetzt bedeutet es

Eine Abfrageanweisung ruft Daten ab, und dann ruft eine andere Abfrageanweisung in derselben Transaktion Daten ab. Die beiden Daten sollten identisch sein, aber tatsächlich werden unterschiedliche Ergebnisse zurückgegeben. !

PS: Anmerkung des Autors: Die unterschiedlichen Ergebnisse beziehen sich hier auf die Situation, in der die Zeile unverändert bleibt (um es professioneller auszudrücken: der Primärschlüsselindex hat sich nicht geändert), sich jedoch der Dateninhalt auf der Festplatte, auf die der Primärschlüsselindex zeigt, geändert hat. Wenn sich der Primärschlüsselindex ändert, z. B. durch das Hinzufügen eines neuen Datenelements oder das Löschen eines Datenelements, handelt es sich nicht um einen nicht wiederholbaren Lesevorgang.

Offensichtlich erfüllt unser Phänomen die Definition eines nicht wiederholbaren Lesevorgangs. Lassen Sie uns als nächstes darüber nachdenken:

Diese Definition des nicht wiederholbaren Lesens kann auch auf das Phänomen des Dirty Read angewendet werden. Offensichtlich erfüllt das Phänomen des Dirty Read, also das Beispiel von **READ_UNCOMMITTED**, auch die Bedingung, in derselben Transaktion unterschiedliche Ergebnisse zurückzugeben! Der umgekehrte Fall ist jedoch nicht unbedingt der Fall. Wenn die Ergebnisse zweier Abfragen in Transaktion A durch eine andere Transaktion B geändert werden und Transaktion B das Ergebnis von Transaktion A ändert, ohne festgeschrieben zu werden, handelt es sich um einen Dirty Read und auch um einen nicht wiederholbaren Lesevorgang. Wenn Transaktion B festgeschrieben wird, bevor das Ergebnis von Transaktion A geändert wird, handelt es sich nicht um einen Dirty Read, sondern um einen nicht wiederholbaren Lesevorgang. 3. Wiederholbares Lesen (REPEATABLE_READ)

Hier ändere ich die Reihenfolge und definiere zuerst das Phantomlesen.

Die von der offiziellen Website für Phantomlesen definierte Adresse lautet

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_phantom

Phantom
Eine Zeile, die im Ergebnissatz einer Abfrage erscheint, aber nicht im Ergebnissatz einer früheren Abfrage. Beispiel: Eine Abfrage wird innerhalb einer Transaktion zweimal ausgeführt und in der Zwischenzeit führt eine andere Transaktion einen Commit aus, nachdem eine neue Zeile eingefügt oder eine Zeile aktualisiert wurde, sodass sie der WHERE-Klausel der Abfrage entspricht.

Übersetzt bedeutet es

Eine Datenzeile wird im Ergebnissatz einer Abfrage angezeigt, die Daten erscheinen jedoch nicht im Ergebnissatz einer früheren Abfrage. Beispielsweise werden zwei Abfragen in einer Transaktion ausgeführt und gleichzeitig fügt eine andere Transaktion eine Zeile ein oder aktualisiert eine Datenzeile (die Daten erfüllen die Bedingungen nach dem Where in der Abfrageanweisung) und führt einen Commit aus!

OK, schauen wir uns das Bild unten an. Sie können selbst beurteilen, ob dieses Phänomen der Definition des Phantomlesens entspricht.

Offensichtlich entspricht dieses Phänomen der Definition des Phantomlesens. Zwei identische Abfragen aus derselben Transaktion erzeugen unterschiedliche Zeilen. Lassen Sie uns als nächstes darüber nachdenken:

Diese Definition des Phantomlesens kann auch auf das Phänomen des nicht wiederholbaren Lesens angewendet werden. Denken Sie selbst darüber nach! Der Umkehrschluss ist nicht unbedingt der Fall. Die Transaktion hat zum zweiten Mal Daten abgefragt, diese sind jedoch nicht im Ergebnissatz der ersten Abfrage enthalten. Wenn es sich bei den Daten um geänderte Daten handelt, handelt es sich bei diesem Phänomen sowohl um einen nicht wiederholbaren Lesevorgang als auch um einen Phantomlesevorgang. Wenn die Daten neu hinzugefügt oder gelöscht werden, gehört dieses Phänomen nicht zum nicht wiederholbaren Lesen, sondern zum Phantomlesen.

Lassen Sie uns als Nächstes darüber sprechen, warum in vielen Artikeln die Leser falsch informiert wurden, indem behauptet wurde, dass wiederholbares Lesen das Phantomleseproblem lösen könne. Der Grund dafür ist ein Satz auf der offiziellen Website
(Die Adresse lautet: https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-record-locks)

Der ursprüngliche Inhalt lautet wie folgt

Standardmäßig arbeitet InnoDB in der Transaktionsisolationsebene REPEATABLE READ. In diesem Fall verwendet InnoDB Next-Key-Locks für Suchvorgänge und Indexscans, wodurch Phantomzeilen verhindert werden (siehe Abschnitt 14.7.4, „Phantomzeilen“).

Nach der ursprünglichen Bedeutung dieses Satzes müsste es heißen:

InnoDB verwendet standardmäßig REPEATABLE READ. Verwenden Sie in diesem Fall Next-Key-Sperren, um das Phantomleseproblem zu lösen!

Es wird geschätzt, dass ein einheimischer Übersetzer daraus

InnoDB verwendet standardmäßig REPEATABLE READ. In diesem Fall kann das Phantomleseproblem gelöst werden!

Dann haben alle weitergemacht und ich habe Sie kopiert, und Sie kennen das Ergebnis!

Offensichtlich ändert sich die Bedeutung vollständig, wenn wir die Bedingung „Next-Key-Sperren werden verwendet!“ weglassen, und wir führen die Anweisung unter dieser Isolationsebene aus.

select * from tx_tb where pId >= 1;

Es handelt sich um einen Snapshot-Lesevorgang, der keine Sperren hinzufügt und das Phantom-Leseproblem überhaupt nicht lösen kann, es sei denn, Sie verwenden

select * from tx_tb where pId >= 1 lock in share mode;

Auf diese Weise verwenden Sie Next-Key-Sperren und lösen das Phantom-Read-Problem!

4. Serielles Lesen (SERIALIZABLE_READ)

Auf dieser Isolationsebene folgt auf alle Select-Anweisungen im Share-Modus automatisch eine Sperre. Daher werden unter dieser Isolationsebene Next-Key-Sperren verwendet, unabhängig davon, wie Sie die Abfrage durchführen. Alle Auswahlvorgänge sind aktuelle Lesevorgänge!


OK, achte auf den roten Teil in der Tabelle oben! Aufgrund der Verwendung von Next-Key-Sperren sperrt InnoDB den Indexdatensatz PiD=1 und die Lücke (1,++∞). Wenn andere Transaktionen Daten in diese Lücke einfügen möchten, werden sie blockiert. Dadurch werden Phantom-Lesevorgänge verhindert.

Manche Leute werden vielleicht sagen, dass sich das Ergebnis Ihrer zweiten Abfrage ebenfalls geändert hat und offensichtlich vom Ergebnis der ersten Abfrage abweicht. Hierzu kann ich nur sagen: Bitte schauen Sie genau hin. Das ist von sich selbst

Es wird durch die Transaktion geändert, nicht durch andere Dinge. Dies ist weder ein Phantomlesen noch ein nicht wiederholbares Lesen.

Zusammenfassen

Da oben jede Menge Unsinn steht, möchte ich eine Tabelle erstellen, um alles zusammenzufassen. Sie können diese Tabelle einfach während des Interviews beantworten. Alles oben genannte dient der Vorbereitung für diese Tabelle!

Isolationsstufe Schmutzige Lektüre Nicht wiederholbares Lesen Phantom lesen
Nicht festgeschrieben lesen Ja Ja Ja
Nicht wiederholbares Lesen NEIN Ja Ja
Wiederholbares Lesen NEIN NEIN Ja
Serialisierung NEIN NEIN NEIN

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Details zur MySQL-Transaktionsisolationsebene
  • Tiefgreifendes Verständnis der Probleme mit der Transaktionsisolationsebene und dem Sperrmechanismus von MySQL
  • MySQL Series 10 MySQL-Transaktionsisolierung zur Implementierung der Parallelitätskontrolle
  • Detaillierte Erläuterung des Lese-Commits der MySQL-Transaktionsisolationsebene
  • Tiefgreifendes Verständnis der vier Isolationsebenen von MySQL-Transaktionen

<<:  Vue+Websocket implementiert einfach die Chat-Funktion

>>:  Detaillierte Schritte zum Hinzufügen von Hosts, die Sie in Zabbix überwachen müssen

Artikel empfehlen

Kopieren und Einfügen ist der Feind der Verpackung

Bevor wir über OO, Entwurfsmuster und die vielen o...

Mehrere praktische Szenarien zur Implementierung der Ersetzungsfunktion in MySQL

REPLACE Syntax REPLACE(String,from_str,to_str) Da...

So verwenden Sie dynamische Parameter und berechnete Eigenschaften in Vue

1. Dynamische Parameter Ab 2.6.0 können Sie einen...

Detailliertes Tutorial zur Offline-Installation von MySQL unter CentOS7

1. Löschen Sie die ursprüngliche MariaDB, sonst k...

Eine Zeile CSS-Code zur Integration von Avatar und Nationalflagge

Es ist Nationalfeiertag und jeder kann es kaum er...

MySQL-Trigger: Beispielanalyse zum Erstellen mehrerer Trigger

Dieser Artikel beschreibt anhand eines Beispiels ...

Probleme und Lösungen bei der Installation und Verwendung von VMware

Die virtuelle Maschine wird verwendet oder es kan...

JS realisiert Spezialeffekte der Webseiten-Navigationsleiste

In diesem Artikel erfahren Sie mehr über einen pr...

Eine kurze Diskussion darüber, ob CSS das Rendern von Seiten blockiert

Vielleicht weiß jeder, dass die JS-Ausführung die...

So legen Sie die Umgebungsvariable PATH im Linux-System fest (3 Methoden)

1. In Windows-Systemen erfordern viele Softwarein...