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

Die Magie des tr-Befehls beim Zählen der Häufigkeit englischer Wörter

Wir alle kennen den Befehl tr, mit dem Ersetzunge...

MySQL-Datenbank Shell import_table Datenimport

Inhaltsverzeichnis MySQL Shell import_table Daten...

Uniapps Erfahrung in der Entwicklung kleiner Programme

1. Erstellen Sie ein neues UI-Projekt Zunächst ei...

Ein einfaches Tutorial zur Verwendung des MySQL-Protokollsystems

Inhaltsverzeichnis Vorwort 1. Fehlerprotokoll 2. ...

Zusammenfassung der Verwendung von setTimeout() in JavaScript

Inhaltsverzeichnis 1. Einleitung 2. Der Unterschi...

Detaillierte Erklärung zum MySQL-Index

Inhaltsverzeichnis 1. Index-Grundlagen 1.1 Einlei...

So implementieren Sie eine Paging-Abfrage in MySQL

SQL-Paging-Abfrage:Hintergrund Im System des Unte...

Objektorientierte Programmierung mit XHTML und CSS

<br />Wenn XHTML und CSS nur objektorientier...

CSS-Benennung: BEM, Scoped CSS, CSS-Module und CSS-in-JS erklärt

Der Anwendungsbereich von CSS ist global. Wenn da...

Vue ElementUI implementiert einen asynchronen Ladebaum

In diesem Artikelbeispiel wird der spezifische Co...

jQuery implementiert alle Warenkorbfunktionen

Inhaltsverzeichnis 1. Alles auswählen 2. Erhöhen ...

Detaillierte Erklärung des Plattformbusses des Linux-Treibers

Inhaltsverzeichnis 1. Einführung in den Plattform...

HTML-Grundlagen - CSS-Stylesheets, Style-Attribute, Format- und Layoutdetails

1. Position : fest Gesperrte Position (relativ zu...

Erfahren Sie, wie Sie eine MySQL-Datenbank auf dem Mac installieren

Laden Sie MySQL für Mac herunter: https://downloa...