1 Probleme bei der Transaktions-Parallelität1.1 Schmutziges LesenWenn eine Transaktion Daten liest, die geändert, aber nicht von einer anderen Transaktion festgeschrieben wurden, wird dies als „Dirty Read“ bezeichnet. 1.2 Nicht wiederholbares LesenWenn derselbe Datensatz innerhalb einer Transaktion zweimal abgerufen wird und die erzielten Ergebnisse zweimal unterschiedlich sind, wird dieses Phänomen als nicht wiederholbarer Lesevorgang bezeichnet. 1.3 Phantom-LesevorgängeWenn eine Transaktion zweimal (oder mehrmals) mit derselben Abfragebedingung abfragt und die Anzahl der gefundenen Einträge inkonsistent ist, wird dies als Phantomlesen bezeichnet. 2 IsolationsebenenWir haben mehrere Probleme vorgestellt, die bei der Ausführung gleichzeitiger Transaktionen auftreten können. Diese Probleme haben auch unterschiedliche Prioritäten. Wir ordnen diese Probleme nach ihrer Schwere: Dirty Read > Nicht wiederholbares Lesen > Phantomlesen Der SQL-Standard legt fest, dass gleichzeitige Transaktionen bei unterschiedlichen Isolationsebenen unterschiedliche Schweregrade aufweisen können. Der konkrete Sachverhalt stellt sich wie folgt dar:
Der SQL-Standard legt fest, dass bei verschiedenen Isolationsstufen bei gleichzeitigen Transaktionen Probleme unterschiedlicher Schwere auftreten können:
3 VersionsketteWir wissen, dass der Clustered-Indexdatensatz einer Tabelle, die die Speicher-Engine InnoDB verwendet, zwei notwendige versteckte Spalten enthält (row_id ist nicht notwendig und die Spalte row_id wird nicht eingeschlossen, wenn die von uns erstellte Tabelle einen Primärschlüssel oder einen von NULL verschiedenen UNIQUE-Schlüssel hat): Angenommen, die Transaktions-ID des eingefügten Datensatzes ist 80, sieht das schematische Diagramm des Datensatzes zu diesem Zeitpunkt wie folgt aus: Angenommen, zwei Transaktionen mit den Transaktions-IDs 100 und 200 führen UPDATE-Operationen für diesen Datensatz aus. Der Operationsablauf ist wie folgt: TRX 100: UPDATE t_people SET name = "Guan Yu" WHERE number = 1; UPDATE t_people SET name = 'Person' WHERE number = 1; TRX 200: UPDATE t_people SET name = "Zhao Yun" WHERE number = 1; UPDATE t_people SET name = "Zhuge Liang" WHERE number = 1; Bei jeder Änderung eines Datensatzes wird ein Undo-Protokoll aufgezeichnet. Jedes Undo-Protokoll verfügt außerdem über ein roll_pointer-Attribut (das Undo-Protokoll, das der INSERT-Operation entspricht, verfügt nicht über dieses Attribut, da der Datensatz keine frühere Version hat). Diese Undo-Protokolle können zu einer verknüpften Liste verbunden werden, sodass die aktuelle Situation wie in der folgenden Abbildung aussieht: Nach jeder Aktualisierung des Datensatzes wird der alte Wert in ein Undo-Protokoll eingetragen, selbst wenn es sich um eine alte Version des Datensatzes handelt. Mit zunehmender Anzahl von Aktualisierungen werden alle Versionen durch das Attribut roll_pointer zu einer verknüpften Liste verbunden. Wir nennen diese verknüpfte Liste eine Versionskette, und der Kopfknoten der Versionskette ist der neueste Wert des aktuellen Datensatzes. Darüber hinaus enthält jede Version auch die Transaktions-ID, die der Generation der Version entspricht. Die Versionskette dieses Datensatzes kann dann verwendet werden, um das Verhalten gleichzeitiger Transaktionen zu steuern, die auf denselben Datensatz zugreifen. Dieser Mechanismus wird als 4 LesenAnzeigen4.1 ReadView-DefinitionInnoDB schlägt ein ReadView-Konzept vor, das hauptsächlich vier wichtige Inhalte umfasst:
4.2 ZugriffskontrolleMit 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:
4.3 Isolation neu betrachtetDa Sie bei Transaktionen mit der Isolationsebene READ UNCOMMITTED Datensätze lesen können, die durch nicht festgeschriebene Transaktionen geändert wurden, können Sie einfach die neueste Version der Datensätze direkt lesen. Bei Transaktionen mit der Isolationsebene SERIALIZABLE verwendet InnoDB Sperren für den Zugriff auf Datensätze. Ein sehr großer Unterschied zwischen den Isolationsebenen READ COMMITTED und REPEATABLE READ in MySQL besteht im Zeitpunkt ihrer Generierung von ReadView. 4.3.1 READ COMMITTEDLesen übermittelt, vor jedem Datenlesen wird ein ReadView generiert. Nehmen wir nun an, dass die Ausführung einer Transaktion mit der Isolationsstufe READ COMMITTED beginnt: Detaillierte Abfrage: #Transaktion mit Isolationsstufe READ COMMITTED #Transaktion 100 und 200 werden nicht festgeschrieben und der Wert des Spaltennamens ist Liu BeiSELECT name FROM t_people WHERE number = 1; Der Ausführungsprozess dieses SELECET ist wie folgt:
Nicht wiederholbares Lesen: Wenn die Transaktionen 100 und 200 gestartet werden, lautet der gelesene Name Liu Bei. Wenn Transaktion 100 festgeschrieben wird, wird für jeden Lesevorgang eine ReadView erstellt, da die Isolationsstufe der Transaktion auf Lesen festgeschrieben ist. Wenn Transaktion 200 gelesen wird, ist die generierte ReadView m_ids [200]. Zu diesem Zeitpunkt lautet der gemäß der Leseregel gelesene Name Zhang Fei. # Verwenden Sie die Transaktion BEGIN mit der Isolationsstufe READ COMMITTED; # SELECE1: Transaktion 100 und 200 wurden nicht übermittelt und der Namenswert ist Liu Bei SELECT name FROM t_people WHERE number = 1; # SELECE2: Transaktion 100 ist festgeschrieben, Transaktion 200 ist nicht festgeschrieben. #Transaktionsabfrage für Transaktion 200, der Namenswert ist Zhang Fei und es erfolgt ein nicht wiederholbarer Lesevorgang. Wählen Sie Name aus Lehrer, wobei Nummer = 1 ist. 4.3.2 WIEDERHOLBARES LESENWiederlesbar, generiert eine ReadView beim ersten Lesen der Daten. Lösen Sie das Problem des nicht wiederholbaren Lesens: 100 Transaktionen und 200 Transaktionen sind aktiviert und ReadView wird erstellt. m_ids ist [100,200] und der gelesene Name ist Liu Bei. Wenn Transaktion 100 festgeschrieben wird, wird aufgrund der Isolationsstufe für erneut gelesene Transaktionen nur eine ReadView erstellt und m_ids ist immer noch [100,200]. Zu diesem Zeitpunkt ist der gemäß der Leseregel gelesene Name immer noch Liu Bei. 5 Phantom-LesungenWenn eine Transaktion zweimal (oder mehrmals) mit derselben Abfragebedingung abfragt und die Anzahl der gefundenen Einträge inkonsistent ist, wird dies als Phantomlesen bezeichnet. Die Transaktion T1 auf der Isolationsebene „REPEATABLE READ“ liest zunächst mehrere Datensätze basierend auf einer Suchbedingung, dann fügt die Transaktion T2 einen Datensatz ein, der die entsprechende Suchbedingung erfüllt, und schreibt ihn fest, und anschließend führt die Transaktion T1 eine Abfrage basierend auf derselben Suchbedingung aus. Was wird das Ergebnis sein? Gemäß den Vergleichsregeln in ReadView kann die Transaktion T1 das Commit von T2 nicht sehen, unabhängig davon, ob die Transaktion T2 vor der Transaktion T1 gestartet wird. Allerdings kann MVCC in InnoDB unter der Isolationsebene REPEATABLE READ Phantomlesevorgänge weitgehend vermeiden, anstatt sie vollständig zu verbieten. #SELECT: Schnappschuss gelesen. Update: wird gerade gelesen. REPEATABLE READ kann das Phantom-Read-Problem beim Snapshot-Read lösen. Das aktuelle Phantom-Read-Problem kann nicht gelöst werden. Beispiele: 1 Führen Sie „begin“ und „select *“ aus. 2 Öffnen Sie ein weiteres Fenster, um die Befehle Einfügen, Auswählen und Übernehmen auszuführen. 3 Kehren Sie zum ursprünglichen Fenster zurück, um die Abfrage auszuführen 4 Update durchführen und abschicken 5 Suche 6 FazitAus der obigen Beschreibung können wir ersehen, dass sich das sogenannte MVCC (Multi-Version Concurrency Control) auf den Prozess des Zugriffs auf die Versionskette von Datensätzen bezieht, wenn normale SELECT-Operationen mithilfe von Transaktionen auf den beiden Isolationsebenen READ COMMITTD und REPEATABLE READ ausgeführt werden. Dadurch können Lese-/Schreib- und Schreib-/Leseoperationen verschiedener Transaktionen gleichzeitig ausgeführt werden, wodurch die Systemleistung verbessert wird. Ein großer Unterschied zwischen den beiden Isolationsebenen READ COMMITTD und REPEATABLE READ ist der Zeitpunkt der Generierung von ReadView. READ COMMITTD generiert vor jedem normalen SELECT-Vorgang einen ReadView, während REPEATABLE READ nur vor dem ersten normalen SELECT-Vorgang einen ReadView generiert und nachfolgende Abfragevorgänge diesen ReadView wiederverwenden, wodurch Phantom-Lesevorgänge grundsätzlich vermieden werden können. 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:
|
<<: Code zur Implementierung eines einfachen Pfeilsymbols mit Div+CSS in HTML
>>: Verwenden Sie die Renderfunktion, um hoch skalierbare Komponenten zu kapseln
[LeetCode] 181.Mitarbeiter verdienen mehr als ihr...
[Problembeschreibung] Auf der Anwendungsseite wir...
Inhaltsverzeichnis Zweck der Tabelle Zum Beispiel...
Auf HTML-Seiten verfügen visuelle Elemente wie Sc...
Dieser Artikel veranschaulicht anhand von Beispie...
Hallo zusammen! Ich bin Mr. Tony, der nur über Te...
Einführung Das mysql-utilities-Toolset ist eine S...
Zweck: Ermöglichen Sie die gleichzeitige lokale S...
Mit den MySQL-Funktionen CAST() und CONVERT() kön...
Inhaltsverzeichnis Arithmetische Operatoren Abnor...
Binäre MySQL-Installationsmethode Laden Sie mysql...
Inhaltsverzeichnis Redo-Protokoll Warum müssen wi...
2048 Minispiel, zu Ihrer Information, der spezifi...
Inhaltsverzeichnis 1. Hintergrund 2. Bedienungssc...
Überblick In einer Datenbank wird ein Index verwe...