Anweisungen zur Verwendung der MySQL-Isolations-Leseansicht

Anweisungen zur Verwendung der MySQL-Isolations-Leseansicht

Welche historische Version kann die aktuelle Transaktion lesen?

Die Leseansicht ist eine Sammlung aller aktuellen Transaktionen, wenn die Transaktion geöffnet wird. Diese Datenstruktur speichert die größte und die kleinste ID in der aktuellen Leseansicht.

Dies ist die Liste der derzeit aktiven Transaktionen, wie unten dargestellt:

ct-trx --> trx11 --> trx9 --> trx6 --> trx5 --> trx3;

ct-trx stellt die ID der aktuellen Transaktion dar und die entsprechende read_view-Datenstruktur ist wie folgt:

Ansicht lesen->creator_trx_id = ct-trx;
read_view->up_limit_id = trx3; niedriger Wasserstand read_view->low_limit_id = trx11; hoher Wasserstand read_view->trx_ids = [trx11, trx9, trx6, trx5, trx3];

low_limit_id ist die „High Water Mark“, also die maximale ID der zu diesem Zeitpunkt aktiven Transaktion. Wenn Sie die Zeile mit db_trx_id>=low_limit_id lesen, bedeutet dies, dass die Daten vor diesen IDs nicht festgeschrieben wurden. Wie in den Kommentaren beschrieben, sind diese Daten nicht sichtbar.

wenn (trx_id >= Ansicht->low_limit_id) {
Rückkehr(FALSCH);
}

Hinweis: readview Teil des Quellcodes

up_limit_id ist die „Low Water Mark“, also die minimale Transaktions-ID in der aktiven Transaktionsliste zu diesem Zeitpunkt. Wenn die db_trx_id der Zeile kleiner als up_limit_id ist, bedeutet dies, dass diese Daten festgeschrieben wurden, als die Transaktion die ID erstellt hat. Wie in den Kommentaren beschrieben, sind diese Daten sichtbar.

wenn (trx_id < Ansicht->up_limit_id) {
Rückkehr(WAHR);
}

Wenn die db_trx_id der Zeile zwischen low_limit_id und up_limit_id liegt, prüfen Sie, ob die db_trx_id des Datensatzes in der Liste read_view->trx_ids der eigenen Transaktion enthalten ist. Wenn ja, ist die aktuelle Version des Datensatzes nicht sichtbar; andernfalls ist die aktuelle Version des Datensatzes sichtbar.

ReadView-Implementierungsmethoden auf verschiedenen Isolationsebenen

1. Lesen-Commit:

Das heißt, während der Ausführung jeder Anweisung wird read_view geschlossen und in der Funktion row_search_for_mysql ein neues read_view erstellt. Dies führt zu einem nicht wiederholbaren Lesevorgang.

2. Wiederholbares Lesen:

Auf der wiederholbaren Leseisolationsebene wird beim Erstellen der Transaktions-TRX-Struktur die aktuelle globale Lese-Ansicht generiert. Wird mit der Funktion trx_assign_read_view erstellt und bis zum Ende der Transaktion beibehalten. Während des Zeitraums, in dem die Transaktion endet, wird die Lese-Ansicht nicht für jede Abfrage neu erstellt, wodurch ein wiederholbares Lesen erreicht wird.

Ergänzung: MySQLs mvcc und readview

Standarddefinition der Isolationsebene:

Nicht festgeschriebenes Lesen Eine Transaktion liest die nicht festgeschriebenen Ergebnisse einer anderen Transaktion (die möglicherweise zurückgesetzt wird). Dies wird als Dirty Read bezeichnet und kann zu Dirty Read-, Phantom Read- und nicht wiederholbaren Leseproblemen führen.

Festgeschriebenes Lesen Eine Transaktion a liest das zuletzt festgeschriebene Ergebnis einer anderen Transaktion b, wodurch die Ergebnisse des zweimaligen Lesens einer Transaktion a unterschiedlich sind. Dadurch werden Dirty Reads, nicht wiederholbare Lesevorgänge und Phantom-Lesevorgänge vermieden, was durch Versionsketten (MVCC) und Readview erreicht wird.

Wiederholbares Lesen (MySQLs Standardisolationsebene) Nachdem eine Transaktion einen Datensatz zum ersten Mal gelesen hat und eine andere Transaktion den Datensatz ändert und festschreibt, liest Transaktion A immer noch den ersten Wert. Dies ist wiederholbares Lesen. Die Ergebnisse, die durch mehrmaliges Lesen derselben Daten in derselben Transaktion zurückgegeben werden, sind dieselben. Eine Transaktion liest keine Änderungen, die von anderen Transaktionen an vorhandenen Daten vorgenommen wurden, selbst wenn andere Transaktionen festgeschrieben wurden. Mit anderen Worten, die Werte der vorhandenen Daten, die zu Beginn der Transaktion gelesen wurden, sind zu jedem Zeitpunkt vor dem Festschreiben der Transaktion dieselben. Allerdings können die neu eingefügten Daten anderer Transaktionen gelesen werden, was ebenfalls das Phantomleseproblem verursacht. Dadurch werden Dirty Reads und nicht wiederholbare Leseprobleme vermieden, Phantom Reads sind jedoch weiterhin vorhanden. Phantomlesen wird immer noch auftreten (aber MySQL löst das Problem des Phantomlesens) durch Versionskette und Readview

Serializable erlaubt kein gleichzeitiges Lesen und Schreiben derselben Datensatzzeile. Es muss seriell ausgeführt werden, sodass es keine Phantom- oder Dirty-Reads gibt.

In MySQL werden die Isolationsebenen für festgeschriebene Lesevorgänge und wiederholbare Lesevorgänge über mvcc und readview implementiert.

MVCC steht für Multi-Version Concurrency Control und verwaltet mehrere Versionen von Daten, sodass das Lesen und Schreiben zwischen Transaktionen entsprechend der Isolationsstufe ohne Konflikte entsprechende Ergebnisse erzielen kann.

Für die Isolationsstufe Read Committed wird jedes Mal ein neuer Readview generiert

Beim wiederholbaren Lesen auf Isolationsebene wird eine Leseansicht nur beim Starten einer Transaktion generiert und ändert sich nicht, bis die Transaktion festgeschrieben wird. Daher kann wiederholbares Lesen garantiert werden.

Beim Generieren von Readview

m_ids: stellt die Liste der aktiven Transaktions-IDs dar

min_trx_id: minimale Transaktions-ID unter aktiven Transaktionen

max_trx_id: Die maximale erstellte Transaktions-ID

creator_trx_id: aktuelle Transaktions-ID

Befolgen Sie für die aktuelle Transaktion die folgenden Regeln, um von der neuesten Version zu gelangen und den entsprechenden Versionsdatensatz zu erhalten.

1. Die aufgerufene trx_id ist dieselbe wie die creator_trx_id in readview, was darauf hinweist, dass die aktuelle Transaktion auf den von ihr selbst geänderten Datensatz zugreift, der sichtbar und zurückgegeben wird.

2. Die aufgerufene trx_id ist kleiner als die min_trx_id, was darauf hinweist, dass die Version übermittelt wurde und sichtbar ist und zurückgegeben wird.

3. Wenn die aufgerufene trx_id größer oder gleich max_trx_id ist, bedeutet dies, dass die Version beim Generieren der Readview nicht aktiviert wurde und daher nicht sichtbar ist und zurückgegeben wird.

4. Wenn die aufgerufene trx_id zwischen min_trx_id und max_trx_id liegt, prüfen Sie, ob sie in m_ids enthalten ist. Wenn ja, bedeutet dies, dass beim Generieren von readview die Transaktion dieser Version nicht festgeschrieben wurde und die Version nicht sichtbar ist. Wenn nicht, bedeutet dies, dass beim Generieren von readview die Transaktion dieser Version festgeschrieben wurde und sichtbar ist und das Ergebnis zurückgegeben wird.

Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Sollten dennoch Fehler oder unvollständige Überlegungen vorliegen, freue ich mich über eine Korrektur.

Das könnte Sie auch interessieren:
  • Erfahren Sie anhand von Beispielen, wie Sie den Präfixindex in MySQL verwenden
  • Zusammenfassung der Analyse langsamer Abfragen aufgrund des MySQL-Präfixindex
  • Detaillierte Erläuterung des Implementierungsprinzips der Transaktionsisolationsstufe in MySQL
  • Lassen Sie uns über die Merkmale und Isolationsstufen von MySQL-Transaktionen sprechen
  • Beschreiben Sie kurz die vier Transaktionsisolationsebenen von MySql
  • Detaillierte Erläuterung des Implementierungsprinzips von MySQL-Transaktionen und Spring-Isolationsebenen
  • Beispielanalyse des Prinzips der MySQL-Transaktionsisolationsebene
  • Detaillierte Erläuterung des Lese-Commits der MySQL-Transaktionsisolationsebene
  • Zusammenfassung zur Verwendung von MySQL-Isolationsspalten und Präfixindizes

<<:  Detailliertes Tutorial zur Integration von Apache Tomcat mit dem IDEA-Editor

>>:  Lassen Sie uns ausführlich über die Requisitenattribute von Komponenten in Vue sprechen

Artikel empfehlen

Detaillierte Beispiele für Linux-Festplattengeräte- und LVM-Verwaltungsbefehle

Vorwort Im Linux-Betriebssystem sind Gerätedateie...

Beispielcode zur Eingabe des Kennzeichens und der Provinzkürzel in html

Das Prinzip besteht darin, zuerst ein Div mit ein...

Einige Hinweise zur MySQL-Self-Join-Deduplizierung

Lassen Sie mich kurz das Funktionsszenario erklär...

Unterschiede zwischen MySQL CHAR und VARCHAR beim Speichern und Lesen

Einführung Kennen Sie wirklich den Unterschied zw...

HTTP-Statuscodes

Dieser Statuscode gibt Auskunft über den Status d...

So konfigurieren Sie den Whitelist-Zugriff in MySQL

Schritte zum Konfigurieren des Whitelist-Zugriffs...

So löschen Sie Junk-Dateien elegant in Linux

Ich frage mich, ob Sie wie ich ein Programmierer ...

So konfigurieren Sie Umgebungsvariablen in einer Linux-Umgebung

JDK-Downloadadresse: http://www.oracle.com/techne...

Sicherheitseinstellungen für Windows 2016 Server

Inhaltsverzeichnis Systemupdate-Konfiguration Änd...

Detaillierte Erläuterung der Docker Volume-Berechtigungsverwaltung

Das Datenvolumen ist ein wichtiges Konzept von Do...

UrlRewriter-Caching-Probleme und eine Reihe damit verbundener Untersuchungen

Beim Entwickeln einer Website-Funktion kann der S...

Wie besteht man die W3C-Validierung?

Neben der Festlegung von Vorschriften für verschi...