MySQL-Transaktionskontrollfluss und ACID-Eigenschaften

MySQL-Transaktionskontrollfluss und ACID-Eigenschaften

1. ACID-Eigenschaften

Die Transaktionsverarbeitung ist ein Verwaltungsmechanismus für MySQL-Operationen, die in Stapeln ausgeführt werden müssen. Wenn während einer Transaktion eine Operation in der Mitte fehlschlägt, wird sie auf den ursprünglichen sicheren Zustand回滾(Rollback) , sofern nicht der gesamte Operationsstapel korrekt ausgeführt wird, um sicherzustellen, dass keine falschen Änderungen an den Systemdaten vorgenommen werden.

Nach MySQL 5.5 wurde die Standard-Speicher-Engine von MyLSAM durch InnoDB ersetzt. Einer der wichtigen Gründe dafür ist, dass InnoDB Transaktionen unterstützt. Sehen wir uns mit SHOW ENGINES die Beschreibung verschiedener Speicher-Engines in MySQL an.

Die vier wichtigsten Eigenschaften von Transaktionen werden oft als ACID Eigenschaften bezeichnet:
A - Atomicity 原子性: Eine Transaktion ist eine unteilbare Kleinsteinheit. Alle Vorgänge in der Transaktion sind entweder erfolgreich oder schlagen fehl, ohne Zwischenzustände. Atomarität wird hauptsächlich durch das Rollback-Protokoll (Undo-Protokoll) im Transaktionsprotokoll erreicht. Wenn eine Transaktion die Datenbank ändert, generiert InnoDB basierend auf der Operation ein Undo-Protokoll für die entgegengesetzte Operation. Beispielsweise wird für eine Einfügeoperation ein Löschdatensatz generiert. Wenn die Transaktion fehlschlägt oder ein Rollback aufgerufen wird, wird sie basierend auf dem Inhalt des Undo-Protokolls in den Zustand vor der Ausführung zurückversetzt.

C - Consistency 一致性: Die Daten befinden sich vor und nach der Ausführung der Transaktion in einem legalen und konsistenten Zustand. Selbst wenn eine Ausnahme auftritt, werden die Integritätsbeschränkungen der Datenbank, z. B. Eindeutigkeitsbeschränkungen, aufgrund der Ausnahme nicht zerstört.

I - Isolation 隔離性: Jede Transaktion ist unabhängig von den anderen und wird nicht durch die Ausführung anderer Transaktionen beeinflusst. Transaktionen sind für andere Transaktionen nicht sichtbar, bevor sie festgeschrieben sind. Die Isolation wird durch die Transaktionsisolationsebene definiert, und ein Sperrmechanismus wird verwendet, um die Isolation von Schreibvorgängen sicherzustellen, und MVCC wird verwendet, um die Isolation von Lesevorgängen sicherzustellen, was weiter unten ausführlich beschrieben wird.

D - Durability 持久性: Die Änderungen an den Daten nach dem Committing der Transaktion sind dauerhaft und gehen auch bei einem Datenbankabsturz nicht verloren. Dies wird durch das Redo-Log im Transaktionsprotokoll sichergestellt. Bevor eine Transaktion geändert wird, werden die Änderungsinformationen vorab in das Redo-Log geschrieben. Wenn die Datenbank abstürzt, werden die Datensätze im Redo-Log gelesen, um die Daten nach der Wiederherstellung wiederherzustellen.

Syntax der Transaktionssteuerung

Die MySQL-Transaktionssteuerung verfügt über mehrere wichtige Knoten, nämlich Transaktionsstart, Commit, Rollback und Speicherpunkt.

Das Starten einer Transaktion bedeutet, dass die Ausführung der Transaktion beginnt. Die Anweisung lautet START TRANSACTION oder BEGIN . Das Commit einer Transaktion bedeutet, dass alle Aktualisierungen in der Transaktion in die physische Datenbank auf der Festplatte geschrieben werden. Die Transaktion endet normalerweise mit COMMIT . Wenn eine Ausnahme auftritt und ein Rollback erforderlich ist, lautet die Anweisung ROLLBACK . Es ist zu beachten, dass eine einmal festgeschriebene Transaktion nicht mehr rückgängig gemacht werden kann. Wenn also während der Codeausführung eine Ausnahme auftritt, müssen Sie anstelle eines Festschreibens direkt ein Rollback ausführen.

Beispiel: A überweist B 100 Yuan:

// Normal ausführen und übermitteln BEGIN; # Transaktion starten UPDATE account_balance SET balance = balance - 100.00 WHERE account_name = 'A';
UPDATE Kontostand SETZEN Kontostand = Kontostand + 100,00 WHERE Kontoname = „B“;
COMMIT; # Transaktion festschreiben // Ausnahme aufgetreten, Rollback BEGIN; # Transaktion starten UPDATE account_balance SET balance = balance - 100.00 WHERE account_name = 'A';
UPDATE Kontostand SETZEN Kontostand = Kontostand + 100,00 WHERE Kontoname = „B“;
ROLLBACK; # Transaktions-Rollback

In komplexen Szenarien müssen wir manchmal nicht den gesamten Vorgang zurücksetzen, sondern ihn in Stapeln ausführen und auf einen bestimmten Knoten zurücksetzen. Dies entspricht der Verschachtelung mehrerer Untertransaktionen unter einer großen Transaktion. In MySQL kann SAVEPOINT verwendet werden, um dies zu erreichen.

BEGINNEN;
in user_tbl(id)-Werte einfügen (1);
in user_tbl(id)-Werte einfügen (2);
ROLLBACK; # 1,2 schreibe nicht BEGIN;
in user_tbl(id)-Werte einfügen (1);
SPEICHERPUNKT s1;
in user_tbl(id)-Werte einfügen (2);
ROLLBACK TO s1; # Rollback zum Aufbewahrungspunkt s1, sodass 1 erfolgreich geschrieben wird, 2 zurückgesetzt wird und das Endergebnis 1 ist

RELEASE SAVEPOINT s1; # Den Speicherpunkt freigeben

Übrigens gibt es zwei Arten von Transaktionen: implizite Transaktionen (automatisch festgeschrieben) und explizite Transaktionen (müssen manuell festgeschrieben werden). MySQL verwendet standardmäßig implizite Transaktionen, die automatisch festgeschrieben und durch den autocommit Parameter gesteuert werden.

# Variablen anzeigen SHOW VARIABLES LIKE 'autocommit';
+---------------+-------+
| Variablenname | Wert |
+---------------+-------+
| Autocommit | EIN |
+---------------+-------+
# Auto-Commit aktivieren (Standard)
Setzen Sie Autocommit = 1;
# Autocommit deaktivieren SET autocommit = 0;

Wenn im automatischen Commit-Status keine Transaktion explizit geöffnet wird, ist jede DML-Anweisung eine Transaktion und das System führt für jede SQL-Anweisung automatisch einen Commit-Vorgang aus. Nachdem Sie eine Transaktion mit BEGIN oder START TRANSACTION gestartet haben, bleibt Autocommit deaktiviert, bis Sie die Transaktion mit COMMIT oder ROLLBACK beenden. An diesem Punkt wird der Autocommit-Modus auf seinen vorherigen Zustand zurückgesetzt.

Es gibt einen weiteren Parameter completion_type, der Standardwert ist 0 (NO_CHAIN)

# Variablen anzeigen SHOW VARIABLES LIKE 'completion_type';
+-----------------+----------+
| Variablenname | Wert |
+-----------------+----------+
| Abschlusstyp | KEINE_KETTE |
+-----------------+----------+

completion_type = 0: Der Standardwert. Nach der Ausführung des Commits wird nicht automatisch eine neue Transaktion gestartet.
completion_type = 1: Die Ausführung von Commit entspricht der Ausführung von COMMIT AND CHAIN ​​und startet automatisch eine Transaktion mit derselben Isolationsstufe.
completion_type = 2: Wenn Commit ausgeführt wird, entspricht dies der Ausführung von COMMIT AND RELEASE. Die Serververbindung wird automatisch getrennt, nachdem die Transaktion festgeschrieben wurde.

3. Ausnahme bei gleichzeitiger Transaktion

In einer tatsächlichen Produktionsumgebung kann es zu gleichzeitigen Anfragen in großem Maßstab kommen. Wenn die Transaktionsisolationsstufe nicht richtig eingestellt ist, können einige abnormale Situationen auftreten. Die häufigsten Anomalien sind臟讀(Dirty Read)、幻讀(Phantom Read) und不可重復讀(Unrepeatable Read)。

1. Schmutzige Lektüre

Dirty Read bedeutet, dass eine Transaktion auf nicht festgeschriebene Daten einer anderen Transaktion zugreift, und zwar wie folgt:

  • Angenommen, der Wert von a ist 1 und Transaktion 2 ändert a in 2. Zu diesem Zeitpunkt wurde die Transaktion noch nicht festgeschrieben.
  • Zu diesem Zeitpunkt liest Transaktion 1 a und der Wert von a ist 2. Transaktion 1 schließt den Lesevorgang ab.
  • Dies führt dazu, dass Transaktion 2 die Änderung an a zurücksetzt (oder nicht festschreibt), sodass der Wert von a wieder auf 1 zurückgesetzt wird.
  • Dies führt dazu, dass der Wert von a 1 ist, das von Transaktion 1 erhaltene Ergebnis jedoch 2 ist, sodass Transaktion 1 fehlerhafte Daten liest und ein fehlerhafter Lesevorgang auftritt.

2. Nicht wiederholbares Lesen

Nicht wiederholbares Lesen bezieht sich auf die Situation, in der sich der Inhalt des Datenwerts während einer Transaktion ändert, bei der dieselben Daten mehrmals gelesen werden, was dazu führt, dass derselbe Wert nicht mehr gelesen werden kann. Es beschreibt das Phänomen der Aktualisierung/Löschung derselben Daten , wie im folgenden Prozess gezeigt:

  • Transaktion 1 liest a und a = 1
  • Zu diesem Zeitpunkt ändert Transaktion 2 a in 2 und wird erfolgreich übermittelt, und die Änderung wird wirksam.
  • Transaktion 1 liest a erneut und jetzt ist a = 2
  • Transaktion 1: Derselbe Wert wird in derselben Transaktion zweimal gelesen, aber der Inhalt des Datenwerts hat sich geändert, was zu einem nicht wiederholbaren Lesevorgang führt.

3. Phantomlesen

Phantomlesen bezeichnet die Situation, in der sich die Anzahl der Datenelemente während einer Transaktion ändert, indem dieselben Daten mehrfach gelesen werden, als ob eine Illusion aufgetreten wäre. Es beschreibt das Phänomen des Einfügens/Löschens für die gesamte Tabelle, wie im folgenden Prozess gezeigt:

  • Transaktion 1 liest die Menge zum ersten Mal und erhält 10 Datenelemente
  • Zu diesem Zeitpunkt fügt Transaktion 2 ein Datenelement ein und wird erfolgreich übermittelt. Die Änderung wird wirksam und die Daten werden 11.
  • Transaktion 1 liest die Nummer erneut und erhält 11 Daten. Für Transaktion 1 gibt es ohne ersichtlichen Grund ein weiteres Datenelement, als wäre es eine Illusion. Es findet ein Phantom-Lesevorgang statt.

4. Transaktionsisolationsebene

Die serialisierte Transaktionsverarbeitung ist natürlich die sicherste Methode, aber die Serialisierung kann die Anforderungen an einen hoch parallelen Zugriff auf die Datenbank nicht erfüllen. Als Kompromiss müssen wir manchmal den Isolationsstandard der Datenbank senken, um die Parallelität der Transaktionen zu erhalten. Dabei müssen wir die Korrektheit innerhalb eines kontrollierbaren Bereichs zugunsten einer verbesserten Effizienz opfern. Dieser Kompromiss wird durch die Isolationsstufe der Transaktion erreicht.

Die Datenbank hat vier Transaktionsisolationsebenen, von niedrig bis hoch:讀未提交Read Uncommitted ,讀已提交Read Committed ,可重復讀Repeatable Read und串行化Serializable .

(1) Nicht festgeschrieben lesen
Ermöglicht das Lesen von nicht festgeschriebenem Inhalt. Abfragen auf dieser Ebene werden nicht gesperrt, daher können Dirty Reads, nicht wiederholbare Reads und Phantom Reads auftreten.
(2) Lesen Sie Commit
Es dürfen nur festgeschriebene Inhalte gelesen werden. Bei Abfragen auf dieser Ebene treten keine Dirty Reads auf, da Dirty-Daten nicht festgeschriebene Daten sind und nicht gelesen werden. Nicht wiederholbare Lesevorgänge und Phantom-Lesevorgänge können jedoch weiterhin auftreten.
(3) Wiederholbares Lesen (Standardisolationsebene von MySQL)
Durch die Verwendung von Zeilensperren, um sicherzustellen, dass die von zwei Abfragen unter denselben Abfragebedingungen erhaltenen Datenergebnisse konsistent sind, können Dirty Reads und nicht wiederholbare Lesevorgänge vermieden werden. Phantomlesevorgänge lassen sich jedoch nicht vermeiden.
(4) Serialisierbar
Die Verwendung von Sperren auf Tabellenebene, um die Serialisierung aller Transaktionen sicherzustellen, kann alle abnormalen Situationen verhindern, beeinträchtigt jedoch die Parallelität des Systems.

Die Toleranz der oben genannten drei abnormalen Situationen in den vier Isolationsstufen ist wie folgt ( Vertreter erlauben, Stellt ein Verbot dar):

Der Befehl zum Anzeigen der Isolationsebene lautet:

VARIABLEN WIE „transaction_isolation“ ANZEIGEN;
# oder SELECT @@global.tx_isolation, @@tx_isolation;

Die zweite Möglichkeit besteht darin, die globalen und aktuellen Sitzungsisolationsebenen anzuzeigen.

Der Befehl zum Festlegen der Isolationsebene lautet :

# Legen Sie die Isolationsstufe der aktuellen Sitzung auf „Nicht festgeschriebenes Lesen“ fest. SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
# Stellen Sie die globale Isolationsebene auf Lesen nicht festgeschriebener Daten ein. SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

Dies ist das Ende dieses Artikels mit der detaillierten Erklärung von MySQL-Transaktionen. Weitere relevante MySQL-Inhalte 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:
  • Wie erreicht MySQL die Parallelität mehrerer Versionen?
  • Detaillierte Erläuterung der MySQL-Filterreplikationsideen
  • Detaillierte Erläuterung des Anwendungsfalls für MySQL-Fremdschlüssel (FOREIGN KEY)
  • So verwenden Sie gespeicherte Prozeduren in MySQL, um schnell 1 Million Datensätze zu generieren
  • Die Python-Schnittstellenautomatisierung analysiert kurz den Betriebsprozess der PyMySQL-Datenbank
  • Mysql verwendet gespeicherte Prozeduren, um schnell Millionen von Datenbeispielcodes hinzuzufügen
  • Implementierung zum Entfernen überlappender Zeiten und Berechnen der Zeitdifferenz in MySQL
  • In der MySQL-Datenbank werden datetime, bigint und timestamp zur Darstellung der Zeitauswahl verwendet. Welches davon ist für die Zeitspeicherung am effizientesten?
  • Spezifische Verwendung von MySQL-Globalsperren und Sperren auf Tabellenebene
  • Analyse der MySQL-Absturzwiederherstellung basierend auf Redo Log und Undo Log

<<:  Erfahren Sie, wie Sie mithilfe des Nginx-Dienstes eine Subdomain-Umgebung erstellen, um die Ladeleistung von 2D-Karten zu verbessern.

>>:  Sprechen Sie über die 8 Benutzerinstinkte hinter der Benutzererfahrung im Design

Artikel empfehlen

Super ausführliches Tutorial zur Installation von MySQL 8.0.23

Inhaltsverzeichnis Vorwort 1. Laden Sie MySQL von...

Lösung für mehrere Docker-Container, die nicht die gleiche Portnummer haben

Hintergrund In Docker werden vier Container mit d...

js, um einfache Lupeneffekte zu erzielen

In diesem Artikelbeispiel wird der spezifische Co...

Beschreibung der chinesischen Sortierregeln für MySQL

Bei der Verwendung von MySQL sortieren und fragen...

Mehrere Möglichkeiten, Axios in Vue zu kapseln

Inhaltsverzeichnis Basisversion Schritt 1: Axios ...

Grafisches Tutorial zur Installation von MySQL 5.5.27

1. Installation von MySQL 1. Öffnen Sie die herun...

So fügen Sie bei der Webseitenerstellung Webfont-Dateien Vektorsymbole hinzu

Wie wir alle wissen, gibt es in Computern zwei Art...

MySQL fängt die SQL-Anweisung der String-Funktion ab

1. left(name,4) fängt die 4 Zeichen auf der linke...