Was ist MVCC MVCC steht für Multi-Version Concurrency Control. Die transaktionale Speicher-Engine von MySQL verbessert die Parallelitätsleistung durch Multi-Version Concurrency Control (MVCC). MVCC kann als eine Variante der Zeilensperre betrachtet werden, vermeidet jedoch in den meisten Fällen Sperrvorgänge und implementiert nicht blockierende Lesevorgänge, sodass der Overhead geringer ist. MVCC wird implementiert, indem ein Snapshot der Daten zu einem bestimmten Zeitpunkt gespeichert wird. Die Kernidee besteht darin, historische Versionen von Daten zu speichern und die Datenbank-Parallelitätskontrolle durch die Verwaltung mehrerer Versionen von Datenzeilen zu implementieren. Auf diese Weise können wir durch Vergleichen der Versionsnummer entscheiden, ob die Daten angezeigt werden sollen, und wir können den Isolationseffekt der Transaktion ohne Sperren beim Lesen der Daten sicherstellen. MVCC-ImplementierungTatsächlich fügt InnoDB nach jeder Datensatzzeile drei versteckte Felder hinzu:
Nehmen wir als Beispiel das RR-Level: Bei jedem Öffnen einer Transaktion weist das System der Transaktion eine Transaktions-ID zu. Wenn die erste Select-Anweisung in der Transaktion ausgeführt wird, wird ein Transaktions-Snapshot ReadView zum aktuellen Zeitpunkt generiert, der im Wesentlichen die folgenden Eigenschaften enthält:
Mit diesem ReadView müssen Sie beim Zugriff auf einen Datensatz nur die folgenden Schritte ausführen, um festzustellen, ob eine Version des Datensatzes sichtbar ist:
Bei der Beurteilung wird zunächst die neueste Version des Datensatzes verglichen. Wenn die Version von der aktuellen Transaktion nicht angezeigt werden kann, wird die vorherige Version über den ROLL_PTR des Datensatzes gefunden und erneut verglichen, bis eine Version gefunden wird, die von der aktuellen Transaktion angezeigt werden kann. Der obige Inhalt gilt für die RR-Ebene. Für die RC-Ebene ist der gesamte Prozess fast derselbe. Der einzige Unterschied besteht im Zeitpunkt der Generierung von ReadView. Die RR-Ebene generiert es nur einmal zu Beginn der Transaktion und dann wird ReadView ständig verwendet. Auf der RC-Ebene wird bei jeder Auswahl ein ReadView generiert. Löst MVCC Phantom-Lesevorgänge? Phantomlesen: In einer Transaktion wird dasselbe SQL zweimal zum Lesen verwendet, und das zweite Lesen enthält Zeilen, die von anderen Transaktionen neu eingefügt wurden. 1) Transaktion 1: Erste Abfrage: 2) Transaktion 2 fügt Daten mit der ID = 2 ein 3) Wenn Transaktion 1 zum zweiten Mal dieselbe Anweisung für die Abfrage verwendet, werden Daten mit der ID = 1 und der ID = 2 gefunden und es erfolgt ein Phantomlesen. Wenn wir über Phantomlesevorgänge sprechen, müssen wir zunächst die Konzepte „aktuelle Lesevorgänge“ und „Schnappschusslesevorgänge“ einführen.
Bei Snapshot-Lesevorgängen erkennt MVCC die neu eingefügten Zeilen nicht, da es aus ReadView liest. Daher wird das Problem der Phantom-Lesevorgänge automatisch gelöst. MVCC kann den Phantomlesevorgang des aktuellen Lesevorgangs jedoch nicht lösen. Sie müssen Gap Lock oder Next-Key Lock (Gap Lock + Record Lock) verwenden, um dieses Problem zu lösen. Tatsächlich ist das Prinzip sehr einfach. Verwenden Sie das obige Beispiel, um es leicht abzuändern und den aktuellen Lesevorgang auszulösen: Wählen Sie * vom Benutzer, bei dem die ID < 10 ist, für die Aktualisierung Wenn Gap Lock verwendet wird, sperrt Gap Lock den gesamten Bereich der IDs < 10, sodass andere Transaktionen keine Daten mit IDs < 10 einfügen können. Dadurch werden Phantomlesevorgänge verhindert. Dies ist das Ende dieses Artikels über die Implementierung der MySQL-Mehrversions-Parallelitätskontrolle MVCC. Weitere relevante Inhalte zur MySQL-Mehrversions-Parallelitätskontrolle MVCC finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: In einem Artikel erfahren Sie, wie Sie Vue-Frontend-Paging und Backend-Paging implementieren.
>>: Beispiel für das Hinzufügen eines Musikvideos zu einer HTML-Seite
Frage: Was ist der Unterschied zwischen int(1) un...
Im Vorstellungsgespräch sollten Sie folgende Szen...
Vorwort Aufgrund der unterschiedlichen Codiergewo...
In diesem Artikel finden Sie das grafische Tutori...
Letztes Jahr habe ich aufgrund von Projektanforde...
Front-End-Projektpaketierung Suchen Sie .env.prod...
In diesem Artikelbeispiel wird der spezifische JS...
Inhaltsverzeichnis 1. Laden Sie die Systemabbildd...
Einführung: Als ich mir in letzter Zeit die Frage...
Verwenden Sie ifnull statt isnull isnull wird ver...
Beachten Sie, dass dies kein von vue-cli erstellt...
Manchmal müssen wir steuern, ob HTML-Elemente auf ...
Vorwort Sehen wir uns zunächst an, wie eine TCP-V...
Inhaltsverzeichnis 1. Globale Wache 1. Globale Fr...
In diesem Artikel wird hauptsächlich die Verwendu...