Lassen Sie uns über die Merkmale und Isolationsstufen von MySQL-Transaktionen sprechen

Lassen Sie uns über die Merkmale und Isolationsstufen von MySQL-Transaktionen sprechen

Das Internet ist bereits voll von Artikeln dieser Art, aber der Grund, warum ich ihn dennoch schreibe, ist ganz einfach: Er soll als Hinweis auf mein eigenes Verständnis dienen.

Vorwort

Dieser Artikel stellt mein persönliches Verständnis von MySQL dar und die verwendete Engine ist InnoDb. Lassen Sie uns zunächst über das Konzept von Transaktionen sprechen. In der dritten Ausgabe von „High Performance MySQL“ lautet die Beschreibung von Transaktionen wie folgt:

Eine Transaktion ist eine Reihe atomarer SQL-Abfragen oder eine unabhängige Arbeitseinheit. Wenn die Datenbank-Engine alle Anweisungen des Abfragesatzes erfolgreich auf die Datenbank anwenden kann, wird der Abfragesatz ausgeführt. Wenn eine der Anweisungen aufgrund eines Absturzes oder aus anderen Gründen nicht ausgeführt werden kann, wird keine der Anweisungen ausgeführt.

Mit anderen Worten, eine Transaktion ist eine integrale Einheit und die darin enthaltenen SQL-Anweisungen werden nicht separat ausgeführt, genau wie einige Produkte, die aus mehreren Komponenten bestehen. Ich verkaufe Komponenten jedoch auf keinen Fall separat. Wenn Sie kaufen möchten, kaufen Sie das gesamte Produkt, sonst verkaufe ich es nicht.

Nach einem einfachen Verständnis von Transaktionen müssen Sie auch wissen, dass der Zweck von Transaktionen darin besteht, die Richtigkeit und Konsistenz von Daten sicherzustellen. Zu diesem Zweck sind seine vier Merkmale entstanden (mehr dazu später). Um diese vier Merkmale zu realisieren, sind viele spezifische Implementierungen erforderlich, darunter vier Isolationsebenen zur Isolierung. Diese vier Isolationsebenen haben drei Probleme verursacht (Dirty Reads, nicht wiederholbare Reads und Phantom Reads). Dies ist die allgemeine Beziehung. Schauen wir uns als Nächstes an, was diese sind.

1 Vier Eigenschaften (ACID)

Wenn wir über Transaktionseigenschaften sprechen, fällt uns sicherlich als Erstes ACID ein. Doch neben den vier Buchstaben ACID müssen wir noch über etwas anderes sprechen.

Atomarität: Das bedeutet, dass eine Transaktion als unteilbare Kleinsteinheit behandelt werden sollte. Die Operationen der gesamten Transaktion werden entweder alle erfolgreich ausgeführt oder überhaupt nicht ausgeführt, genau wie Atome. (Erwähnen Sie mir gegenüber nichts von Quarks.) Die Ausführung bezieht sich hier auf die erfolgreiche Ausführung. Wenn eine Operation fehlschlägt, wird keine davon ausgeführt. Dies ist auch das Rollback, das wir normalerweise sehen.

​​ Konsistenz: Die im Buch gegebene Bedeutung ist, dass Transaktionen immer von einem konsistenten Zustand in einen anderen konsistenten Zustand springen. Nach meinem Verständnis bleibt es innerhalb des betreffenden Datenbereichs erhalten, d. h. die Gesamtdaten bleiben unverändert. Nehmen wir das allgemeine Beispiel einer Geldüberweisung. Konto A überweist 200 Yuan auf Konto B. Dann hat sich der aus A und B bestehende Datenbereich nicht geändert (-200 + 200 = 0), aber die Zusammensetzung der Daten hat sich geändert, sodass es von einem konsistenten Zustand zu einem anderen konsistenten Zustand kommt.

Isolation: Generell sind die Operationen einer Transaktion für andere Transaktionen nicht sichtbar, das heißt, die Transaktionen sind grundsätzlich unabhängig. Dies hängt jedoch mit der Isolationsstufe der Datenbank zusammen. Mit Ausnahme einer bestimmten Isolationsstufe (ja, das sind Sie – lesen Sie nicht festgeschriebenen Klassenkameraden) sind die anderen unsichtbar, und diese Ebene der Transaktionssichtbarkeit wird selten verwendet, daher wird sie „allgemein gesprochen“ genannt.

Dauerhaftigkeit: Sobald eine Transaktion abgeschlossen ist, werden die durch die Transaktion verursachten Datenänderungen dauerhaft wirksam und ändern sich nicht (sofern sie nicht durch eine andere Transaktion geändert werden). Im Buch wird jedoch erwähnt, dass dies tatsächlich mit der Implementierungsstrategie zusammenhängt, aber das scheint etwas weit hergeholt (ja, ich verstehe das nicht!).

Das Obige sind die vier Merkmale von Transaktionen. Die Implementierung der Isolation hängt von der Isolationsstufe der Datenbank ab.

2 Datenbankisolationsebene

In MySQL gibt es vier Isolationsebenen. Jede Isolationsebene entspricht unterschiedlichen Transaktionen und kann unterschiedliche Probleme verursachen.

​​ Nicht festgeschriebenes Lesen: Auf dieser Isolationsebene können in einer Transaktion ausgeführte Vorgänge von anderen Transaktionen gesehen werden, auch wenn sie nicht festgeschrieben sind. Auf dieser Ebene kann eine Transaktion fehlerhafte Daten lesen, die nicht von anderen Transaktionen festgeschrieben wurden. Das heißt, es kann zu fehlerhaften Lesevorgängen kommen. Wie in der folgenden Abbildung gezeigt, geben die Sequenznummern die Ausführungsreihenfolge an.

Wie Sie sehen, werden in der Transaktion auf Seite 1 Daten in die Testtabelle eingefügt. Auch wenn diese noch nicht übermittelt wurden, sind die übermittelten Daten in einer weiteren Transaktion auf Seite 2 zu sehen.

​​ Festgeschriebenes Lesen: Nachdem eine Transaktion festgeschrieben wurde, können andere Transaktionen die an der Transaktion vorgenommenen Änderungen sehen. Diese Isolationsebene kann dazu führen, dass dieselbe Abfrage in derselben Transaktion ausgeführt wird, aber unterschiedliche Daten gelesen werden. Dies wird als nicht wiederholbares Lesen bezeichnet. Nicht wiederholbares Lesen kann auch bei nicht festgeschriebenen Lesevorgängen auftreten. Beispiele sind wie folgt

Wiederholbares Lesen: Dies ist die Standardisolationsstufe von MySQL. Zu Beginn einer Transaktion wird ein Snapshot gespeichert (hier werde ich genauer darauf eingehen. Tatsächlich handelt es sich um einen Snapshot, der erstellt wird, wenn die erste Anweisung nach dem Start der Transaktion ausgeführt wird. Die Methode zum Erstellen des Snapshots besteht darin, die Versionsnummer der aktuellen Transaktion aufzuzeichnen. Es werden keine Daten kopiert. Wenn Sie die Versionsnummer der Transaktion oder die ausgeblendeten Felder nicht verstehen, können Sie sich MySQLs MVCC ansehen.) Dann werden alle nachfolgenden Datenlesevorgänge dieser Transaktion aus diesem Snapshot gelesen, sodass es keine nicht wiederholbaren Lesevorgänge gibt, aber Phantomlesevorgänge können dennoch auftreten. Dies bedeutet, dass sich die Daten der Snapshot-Tabelle beim Lesen nicht ändern, die Anzahl der Aktualisierungen bei Schreibvorgängen wie Updates jedoch von der erwarteten Anzahl abweichen kann. Wie gezeigt

Es ist ersichtlich, dass Schnittstelle 2 die übermittelten Daten immer noch nicht lesen kann, nachdem ein Datensatz in Schnittstelle 1 eingefügt und übermittelt wurde, da sie zu Beginn der Transaktion aus der Snapshot-Tabelle gelesen wurden und daher natürlich nicht gelesen werden können. Wenn jedoch der Aktualisierungsvorgang ausgeführt wird, werden unerwartete Datensätze aktualisiert. Dies ist ein Phantomlesephänomen.

Serialisierbar: Dies bedeutet, dass Transaktionen einzeln verarbeitet werden müssen. Wenn in einer Transaktion ein Lesevorgang ausgeführt wird, können andere Transaktionen nur Lesevorgänge ausführen, bevor die Transaktion abgeschlossen ist. Wenn ein Schreibvorgang ausgeführt wird, warten die Vorgänge anderer Transaktionen (bis die aktuelle Transaktion festgeschrieben ist). Diese Ebene kann aktuelle Phänomene wie Dirty Reads, nicht wiederholbare Reads und Phantom Reads verhindern. Wie gezeigt

Die obige Abbildung zeigt, dass beim Lesen einer Transaktion andere Transaktionen nicht schreiben können. Die folgende Abbildung zeigt, dass beim Schreiben keine Operationen möglich sind.

3 Drei Probleme: Dirty Reads, nicht wiederholbare Reads und Phantom Reads.

Dies sind einige der Probleme, die durch die Verwendung unterschiedlicher Isolationsebenen von Transaktionen entstehen können. Die Isolationsebenen wurden oben bereits erwähnt, werden aber dennoch separat aufgeführt, um Verwirrung zu vermeiden.

  • Dirty Read: bezieht sich auf das Lesen schmutziger Daten in einer Transaktion, die nicht von anderen Transaktionen festgeschrieben wurden, was auf der Ebene „Read Uncommit“ erfolgt.
  • Nicht wiederholbares Lesen: Dieselbe Abfrage in einer Transaktion kann unterschiedliche Ergebnisse haben. Dies tritt auf den Ebenen „Read Uncommit“ und „Read Commit“ auf. (Ich persönlich denke, dass es nicht notwendig ist, zu verstehen, was als nicht wiederholbar bezeichnet wird, da es leicht zu Verwirrungen kommen kann.)
  • Phantomlesen: Beim Ausführen eines Schreibvorgangs in einer Transaktion weicht die Anzahl der Änderungen von der erwarteten Anzahl ab. Beispielsweise werden Daten geändert, die zuvor nicht abgefragt werden konnten.

​​ Lassen Sie mich den Unterschied zwischen nicht wiederholbaren Lesevorgängen und Phantomlesevorgängen erklären: Nicht wiederholbare Lesevorgänge können als Änderungen im Feldwert dieses Datensatzes verstanden werden, beispielsweise sind die beiden Werte des Namens im Datensatz mit der ID 1 unterschiedlich; während Phantomlesevorgänge Unterschiede in der Menge darstellen, beispielsweise sind bei meiner Abfrage insgesamt 2 Datensätze vorhanden, aber wenn ich den Änderungsvorgang durchführe, werden 3 Datensätze aktualisiert.

Oben sind die Details zu den Merkmalen und Isolationsstufen von MySQL-Transaktionen aufgeführt. Weitere Informationen zu den Merkmalen und Isolationsstufen von MySQL-Transaktionen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Tiefgreifendes Verständnis der Probleme mit der Transaktionsisolationsebene und dem Sperrmechanismus von MySQL
  • Wie wird die Transaktionsisolation von MySQL erreicht?
  • MySQL Series 10 MySQL-Transaktionsisolierung zur Implementierung der Parallelitätskontrolle
  • Detaillierte Erläuterung der MySQL-Transaktionsisolationsebene und des MVCC
  • 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
  • Details zur MySQL-Transaktionsisolationsebene

<<:  Detaillierte Erklärung zur Verwendung der Vue-Komponente zur Kennzeichensuche

>>:  Verwendung des Linux-Telnet-Befehls

Artikel empfehlen

Vue implementiert einen beweglichen schwebenden Button

In diesem Artikelbeispiel wird der spezifische Co...

Beispiel zum Aktivieren langsamer Abfragen in MySQL

Vorwort Das langsame Abfrageprotokoll ist eine se...

MySQL5.6.31 winx64.zip Installations- und Konfigurationstutorial

#1. Herunterladen # #2. Entpacken Sie die Datei l...

Beispielcode für horizontales Balkendiagramm von Echarts Bar

Inhaltsverzeichnis Horizontales Balkendiagramm Da...

Fallstricke bei der neueren Version des IDEA2021 Tomcat10-Servlets

Da die Version, die ich beim Lernen verwendet hab...

Detaillierter Vergleich von Ember.js und Vue.js

Inhaltsverzeichnis Überblick Warum ein Framework ...

Detaillierte Erklärung von Objektliteralen in JS

Inhaltsverzeichnis Vorwort 1. Setzen Sie den Prot...

So verbinden Sie JDBC mit MySQL 5.7

1. Bereiten Sie zunächst die MySQL- und Eclipse-U...

So fügen Sie Bilder in HTML-Seiten ein und fügen Kartenindexbeispiele hinzu

1. Im Web unterstützte Bildformate: GIF: kann 256...

MySQL lernen: Drei Paradigmen für Anfänger

Inhaltsverzeichnis 1. Paradigmenfundament 1.1 Der...