Eine kurze Analyse von MySQL - MVCC

Eine kurze Analyse von MySQL - MVCC

Versionskette

In den Tabellen der InnoDB-Engine gibt es in den Clustered-Index-Datensätzen zwei versteckte Spalten:

  • trx_id: wird zum Speichern der Transaktions-ID beim Ändern von Daten verwendet
  • roll_pointer: Jedes Mal, wenn ein Clustered-Index-Datensatz geändert wird, wird die alte Version in das Undo-Protokoll geschrieben. Dieser Roll_Pointer speichert einen Zeiger, der auf den Speicherort der vorherigen Version dieses Clustered-Index-Datensatzes zeigt, über den die Datensatzinformationen der vorherigen Version abgerufen werden können.

Ausweis Name TRX_ID - TRX_ID ist eine eingetragene Marke von TRX_ID. roll_pointer
1 Xiao Ming 50 Version:

Beispielsweise gibt es eine Transaktion mit TRX_ID 60, die die folgende Anweisung ausführt: Update Table Set Name = 'Xiaoming1', wobei ID = 1

An dieser Stelle gibt es eine Versionskette im Undo-Log

Ausweis Name TRX_ID - TRX_ID ist eine eingetragene Marke von TRX_ID. roll_pointer
1 1 von 1 60 letzte_version
↓Zeigen Sie auf
1 Xiao Ming 50 Null

Die Versionskette kann git ähneln, das eine Versionskontrolle für eine Datenzeile durchführen und über undo_log zurückgesetzt werden kann

LesenAnzeigen

Der Unterschied zwischen Read Committed und Repeatable Read besteht darin, dass sie unterschiedliche Strategien zum Generieren von ReadView haben.

ReadView verfügt hauptsächlich über eine Liste zum Speichern der aktuell aktiven Lese- und Schreibtransaktionen in unserem System (Beginn der Transaktion, die noch nicht festgeschrieben wurde). Mithilfe dieser Liste wird ermittelt, ob eine Version des Datensatzes für die aktuelle Transaktion sichtbar ist. Angenommen, die Transaktions-ID in der aktuellen Liste ist [80,100].

ID <= 80 (minimale Transaktions-ID)
ID >= 80 und ID <= 100
Ich würde >= 100

Diese Datensätze werden in der Versionskette durchsucht. Dabei wird zuerst der aktuellste Datensatz durchsucht. Erfüllt die Transaktions-ID des aktuellsten Datensatzes die Bedingungen nicht und ist er nicht sichtbar, wird die vorherige Version durchsucht und die ID der aktuellen Transaktion mit der Transaktions-ID dieser Version verglichen, um zu sehen, ob auf diese zugegriffen werden kann. Dieser Vorgang wird so lange wiederholt, bis eine sichtbare Version zurückgegeben wird oder der Vorgang beendet wird.

Beispielsweise in der Isolationsebene „Read Committed“:

Beispielsweise gibt es zu diesem Zeitpunkt eine Transaktion mit der Transaktions-ID 100, die den Namen so ändert, dass er „Xiaoming 2“ lautet, die Transaktion wurde jedoch noch nicht festgeschrieben. Die Versionskette zu diesem Zeitpunkt ist

Ausweis Name TRX_ID - TRX_ID ist eine eingetragene Marke von TRX_ID. roll_pointer
1 Xiao Ming 2 100 letzte_version
↓Zeigen Sie auf
1 1 von 1 60 letzte_version
↓Zeigen Sie auf
1 Xiao Ming 50 Null

Zu diesem Zeitpunkt initiiert eine andere Transaktion eine Select-Anweisung, um den Datensatz mit der ID 1 abzufragen, und die generierte ReadView-Liste ist nur [100]. Gehen Sie dann zur Versionskette, um sie zu finden. Zuerst müssen Sie die aktuellste Version finden. Sie werden feststellen, dass trx_id 100 ist, was der Datensatz mit dem Namen Xiaoming 2 ist. Er befindet sich in der Liste, daher kann nicht darauf zugegriffen werden.

Zu diesem Zeitpunkt suchen wir weiter über den Zeiger nach dem nächsten Datensatz mit dem Namen Xiaoming 1 und stellen fest, dass trx_id 60 ist, was kleiner als die Mindest-ID in der Liste ist, sodass darauf zugegriffen werden kann. Das direkte Zugriffsergebnis ist Xiaoming 1.

Zu diesem Zeitpunkt bestätigen wir die Transaktion mit der Transaktions-ID 100 und erstellen eine neue Transaktion mit der ID 110, um den Datensatz mit der ID 1 zu ändern, und bestätigen die Transaktion nicht.

--trx_id = 110
BEGINNEN;
Tabellensatzname aktualisieren = „Xiaoming3“, wobei ID = 1

Zu diesem Zeitpunkt ist die Versionskette

Ausweis Name TRX_ID - TRX_ID ist eine eingetragene Marke von TRX_ID. roll_pointer
1 Xiao Ming 3 110 letzte_version
↓Zeigen Sie auf
1 Xiao Ming 2 100 letzte_version
↓Zeigen Sie auf
1 1 von 1 60 letzte_version
↓Zeigen Sie auf
1 Xiao Ming 50 Null

Zu diesem Zeitpunkt hat die vorherige Auswahltransaktion eine weitere Abfrage ausgeführt, um den Datensatz mit der ID 1 abzufragen.

Unterschiedliche Isolationsstufen führen hier zu unterschiedlichen Ergebnissen

Wenn Sie sich in der Isolationsebene für festgeschriebenes Lesen befinden, erstellen Sie zu diesem Zeitpunkt eine neue ReadView und der Wert in Ihrer Liste aktiver Transaktionen ändert sich auf [110].

Gemäß der obigen Anweisung gehen Sie zur Versionskette und vergleichen trx_id, um das entsprechende Ergebnis zu finden, nämlich Xiao Ming 2.

Wenn Sie sich in der wiederholbaren Leseisolationsebene befinden, ist Ihr ReadView immer noch das ReadView, das während der ersten Auswahl generiert wurde, d. h. der Wert der Liste ist immer noch [100]. Das Ergebnis der Auswahl ist also Xiao Ming 1. Das Ergebnis der zweiten Auswahl ist also dasselbe wie das der ersten, es wird also als wiederholbares Lesen bezeichnet!

Dies ist MySQLs MVCC, das mehrere Versionen über Versionsketten implementiert und gleichzeitige Lese-/Schreib- und Schreib-/Lesevorgänge ausführen kann. Durch unterschiedliche Strategien zur ReadView-Generierung werden unterschiedliche Isolationsstufen erreicht.

Das Obige ist eine kurze Analyse der Details von MySQL - MVCC. Weitere Informationen zu MySQL MVCC finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Detaillierte Untersuchung der MySQL-Mehrversions-Parallelitätskontrolle MVCC
  • Detaillierte Erläuterung des MySQL MVCC-Mechanismusprinzips
  • Implementierung der MVCC-Mehrversions-Parallelitätskontrolle von MySQL
  • Implementierung der MySQL-Mehrversions-Parallelitätskontrolle MVCC
  • Analyse des zugrunde liegenden Prinzips der MySQL-Mehrversions-Parallelitätskontrolle MVCC

<<:  Installieren Sie OpenSSL unter Windows und verwenden Sie OpenSSL zum Generieren öffentlicher und privater Schlüssel

>>:  Beispiel für die Implementierung eines gestrichelten Rahmens mit html2canvas

Artikel empfehlen

So ändern Sie Farben und Designs in Vim unter Linux

Vim ist ein Texteditor, den wir unter Linux sehr ...

So erstellen Sie einen MySQL PXC-Cluster

Inhaltsverzeichnis 1. Einführung in PXC 1.1 Einfü...

Vue Storage enthält eine Lösung für Boolesche Werte

Vue speichert Speicher mit Booleschen Werten Ich ...

Mehrere Möglichkeiten zum Ändern des MySQL-Passworts

Vorwort: Bei der täglichen Verwendung der Datenba...

So speichern Sie Bilder in MySQL

1 Einleitung Beim Gestalten einer Datenbank ist e...

Beschreibung des MySQL-Optimierungsparameters query_cache_limit

query_cache_limit query_cache_limit gibt die Puff...

Detaillierte Installation und Konfiguration von hadoop2.7.2 unter Ubuntu15.10

Im Internet und in vielen Büchern gibt es viele T...

JavaScript-Timer zum nahtlosen Scrollen von Bildern

In diesem Artikel wird der spezifische JavaScript...

Teilen Sie JS vier lustige Hacker-Hintergrundeffektcodes

Inhaltsverzeichnis Beispiel 1 Beispiel 2 Beispiel...

So verkleinern Sie das Stammverzeichnis des XFS-Partitionsformats in Linux

Inhaltsverzeichnis Vorwort Systemumgebung Aktuell...