Automatischer Commit-Vorgang für MySQL-Transaktionen

Automatischer Commit-Vorgang für MySQL-Transaktionen

Der Standardbetriebsmodus von MySQL ist der Autocommit-Modus. Dies bedeutet, dass jede Abfrage automatisch als separate Transaktion ausgeführt wird, sofern Sie nicht explizit eine Transaktion starten. Wir können den Auto-Commit-Modus ändern, indem wir den Autocommit-Wert festlegen.

Sie können den aktuellen Autocommit-Modus mit dem folgenden Befehl anzeigen

mysql> Variablen wie „autocommit“ anzeigen;
+---------------+-------+
| Variablenname | Wert |
+---------------+-------+
| Autocommit | EIN |
+---------------+-------+
1 Zeile im Satz (0,04 Sek.)

Aus den Abfrageergebnissen geht hervor, dass der Wert von Value ON ist, was bedeutet, dass Autocommit aktiviert ist. Wir können diesen Modus mit der folgenden SQL-Anweisung ändern

mysql> setze Autocommit = 0;

Der Wert 0 entspricht AUS und 1 bedeutet natürlich EIN. Durch die Einstellung „autocommit=0“ oben bleibt der Benutzer in einer Transaktion, bis eine Commit- oder Rollback-Anweisung ausgeführt wird, um die aktuelle Transaktion zu beenden und eine neue zu starten.

Beispielsweise überweist Zhang San 500 Yuan an Li Si. Dann sollten die Operationen in der Datenbank wie folgt sein:

1. Prüfen Sie zunächst, ob das Kontoguthaben von Zhang San ausreicht

2. 500 Yuan werden von Zhang Sans Konto abgebucht

3. Fügen Sie 500 Yuan zu Li Sis Konto hinzu

Die oben genannten drei Schritte können zum Commit in eine Transaktion gepackt werden. Dabei werden entweder alle oder keiner ausgeführt. Wenn alles in Ordnung ist, führen Sie ein Commit aus, um die Daten dauerhaft zu ändern. Wenn ein Fehler auftritt, führen Sie ein Rollback zum Zustand vor der Änderung durch. Durch die Verwendung der Transaktionsverarbeitung kommt es nicht dazu, dass Zhang Sans Guthaben reduziert wird, Li Sis Kontostand jedoch nicht um 500 Yuan erhöht wird, oder dass Zhang Sans Guthaben nicht reduziert wird, Li Sis Kontostand jedoch um 500 Yuan erhöht wird.

Die Standardspeicher-Engine für MySQL ist MyISAM, die keine Transaktionsverarbeitung unterstützt, sodass eine Änderung des Autocommits wirkungslos ist. Es wird jedoch kein Fehler gemeldet. Wenn Sie also die Transaktionsverarbeitung verwenden möchten, stellen Sie sicher, dass die von Ihnen verwendete Datenbank die Transaktionsverarbeitung unterstützt, beispielsweise InnoDB. Wenn Sie die Speicher-Engine der Tabelle nicht kennen, können Sie in der Anweisung zur Tabellenerstellung nachsehen, ob es eine Speicher-Engine mit einem beim Erstellen der Tabelle angegebenen Transaktionstyp gibt. Wenn keine Speicher-Engine angegeben ist, ist die Standardspeicher-Engine MyISAM, die keine Transaktionen unterstützt.

Natürlich soll die Transaktionsverarbeitung die Atomizität, Konsistenz, Isolierung und Persistenz von Tabellendaten sicherstellen.

Diese verbrauchen Systemressourcen, wählen Sie daher sorgfältig aus.

Ergänzung: MySQL-Transaktionsverarbeitung (Transation) und automatische Ausführung (AutoCommit) und Übermittlungstyp (Completion)

1. Transaktion

In der Computersprache bezeichnet eine Transaktion eine Einheit einer Programmausführung, die auf verschiedene Datenelemente in einer Datenbank zugreift und diese ggf. aktualisiert. Transaktionen werden hauptsächlich zur Verarbeitung von Daten mit großem Operationsvolumen und hoher Komplexität verwendet. Wenn Sie eine Information in einer Mastertabelle löschen möchten und die Mastertabelle mehrere Slavetabellen hat, müssen Sie die Details Schritt für Schritt löschen und dann die Informationen der Mastertabelle löschen. Dieser Vorgang ist äußerst fehleranfällig. In diesem Fall ist es am besten, eine Transaktion zu verwenden, um ihn abzuwickeln.

2. Nutzung von Transaktionen

Transaktion starten oder beginnen

Begehen

Rollback

3. Von MYSQL unterstützte Engines (InnoDB)

Motoren anzeigen;

4. AutoCommit und Vervollständigung

Es gibt zwei Möglichkeiten, Transaktionen zu verwenden: implizite Transaktionen und explizite Transaktionen. Implizite Transaktionen sind eigentlich automatische Commits. Oracle führt standardmäßig keine automatischen Commits aus, und Sie müssen COMMIT manuell schreiben. In MySQL ist Autocommit in Engines aktiviert, die Transaktionen unterstützen. Wenn autocommit=true ist, werden Anweisungen direkt übermittelt, ohne dass dauerhafte Änderungen vorgenommen werden. MySQL aktiviert Autocommit standardmäßig und kann auch über die Konfiguration eingestellt werden.

setze Autocommit=0;(AutoCommit aus)
setze autocommit=1;(AutoCommit Ein)
setze completion_type=0;(Keine Kette)
setze completion_type=1;(Kette)
setze completion_type=2;(Freigabe)

Sie können die aktuelle Konfiguration auch über Anweisungen abfragen

Variablen wie „%autocommit%“ anzeigen;
Variablen wie „%completion%“ anzeigen; 

5. Verifizierungsbeispiel

mysql> BEGINNEN;
 -> IN TEST EINFÜGEN AUSWÄHLEN 'Guan Yu';
 -> VERPFLICHTEN;
 -> BEGINNEN;
 -> INSERT INTO test SELECT 'Befehl';
 -> INSERT INTO test SELECT 'Befehl';
 -> ROLLBACK;
 -> AUSWÄHLEN * AUS Test;
 -> //
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)
Abfrage OK, 0 Zeilen betroffen (0,03 Sek.)
Abfrage OK, 1 Zeile betroffen (0,03 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0
FEHLER 1062 (23000): Doppelter Eintrag „张飞“ für Schlüssel „PRIMARY“

mysql> wähle * aus Test;//

Aktuelle Fensterergebnisse:

Neues Fensterergebnis:

Schlussfolgerung: Aufgrund der Eindeutigkeitsbeschränkung des Namens in der Testtabelle löst beim Betrachten des Codes nach der Ausführung der beiden „Zhang Fei“ (unabhängig davon, ob die Primärschlüsselbeschränkung ausgelöst wird oder nicht) der zweite „Zhang Fei“ tatsächlich die Eindeutigkeitsbeschränkungsausnahme aus, daher denke ich, dass die Transaktion herausspringen wird. Daher ist in der aktuellen Verbindung ein Zhang Fei in der Testtabelle zu sehen. Tatsächlich wurde die zweite Transaktion nicht erfolgreich übermittelt.

Versuchen wir als Nächstes, die Daten auf normale Weise zu übermitteln.

mysql> BEGINNEN;
 -> IN TEST EINFÜGEN AUSWÄHLEN 'Guan Yu';
 -> VERPFLICHTEN;
 -> BEGINNEN;
 -> INSERT INTO test SELECT 'Befehl';
 -> INSERT INTO test SELECT 'Liu Bei';
 -> ROLLBACK;
 -> //
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)
Abfrage OK, 1 Zeile betroffen (0,03 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0
Abfrage OK, 1 Zeile betroffen (0,04 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0
Abfrage OK, 0 Zeilen betroffen (0,04 Sek.)


mysql> wähle * aus Test;//

Aktuelle Fensterergebnisse:

Neues Fensterergebnis:

Fazit: Verglichen mit den Testergebnissen dieses Mal denke ich, dass beim ersten Test kein Rollback ausgeführt wurde, sondern der Ausnahmemechanismus der Transaktionsverarbeitung ausgefallen ist.

Da MySQL Autocommit standardmäßig aktiviert, möchte ich überprüfen, wie die beiden „Zhang Fei“ miteinander umgehen, wenn keine explizite Transaktion vorliegt (d. h. kein Beginn)?

mysql> BEGINNEN;
 -> IN TEST EINFÜGEN AUSWÄHLEN 'Guan Yu';
 -> VERPFLICHTEN;
 -> INSERT INTO test SELECT 'Befehl';
 -> INSERT INTO test SELECT 'Befehl';
 -> ROLLBACK;
 -> //
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)
Abfrage OK, 1 Zeile betroffen (0,05 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0

FEHLER 1062 (23000): Doppelter Eintrag „张飞“ für Schlüssel „PRIMARY“
mysql> wähle *aus Test;//

Aktuelle Fensterergebnisse:

Neues Fensterergebnis:

Fazit: Tatsächlich können Sie anhand der Ausführungsergebnisse erkennen, dass die erste „Zhang Fei“ erfolgreich als separate Transaktion ausgeführt wurde und die zweite „Zhang Fei“ fehlschlug, weil die Primärschlüsseleinschränkung ausgelöst wurde. Gibt es neben der Anzeige der Transaktion eine Möglichkeit, die beiden „Zhang Fei“ vor dem Beenden der Transaktion zu einer Transaktion zusammenzuführen (ohne Commit)?

Sie können completion_type=1;(chain) festlegen. Dies bedeutet, dass es sich bei allen „Zhang Fei“s um eine einzige Transaktion handelt, bevor sie übermittelt werden, egal wie viele es sind.

Der Code ist der gleiche wie oben.

mysql> SET @@completion_type = 1;
 -> BEGINNEN;
 -> IN TEST EINFÜGEN AUSWÄHLEN 'Guan Yu';
 -> VERPFLICHTEN;
 -> INSERT INTO test SELECT 'Befehl';
 -> INSERT INTO test SELECT 'Befehl';
 -> ROLLBACK;
 -> //
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
Abfrage OK, 1 Zeile betroffen (0,02 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0
Abfrage OK, 0 Zeilen betroffen (0,02 Sek.)
Abfrage OK, 1 Zeile betroffen (0,02 Sek.)
Datensätze: 1 Duplikate: 0 Warnungen: 0
FEHLER 1062 (23000): Doppelter Eintrag „张飞“ für Schlüssel „PRIMARY“

Aktuelle Fensterergebnisse:

Neues Fensterergebnis:

Fazit: Da ich completion_type = 1 (Kette) gesetzt habe, was dem Hinzufügen von begin vor dem ersten „Zhang Fei“ entspricht, hat der zweite „Zhang Fei“ die Primärschlüsseleinschränkung ausgelöst, was dazu führte, dass die Transaktion fehlschlug und die Dateneinfügung fehlschlug.

Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Sollten dennoch Fehler oder unvollständige Überlegungen vorliegen, freue ich mich über eine Korrektur.

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Implementierungsprinzips der Transaktionsisolationsstufe in MySQL
  • Detaillierte Erklärung der Syntax und des Prozesses der Ausführung von MySQL-Transaktionen
  • Beschreibung der Standardtransaktionsisolationsebene von MySQL und Oracle
  • Allgemeine MySQL-Anweisungen zum Anzeigen von Transaktionen und Sperren
  • MySQL Master-Slave-Synchronisation, Implementierungsprinzip des Transaktions-Rollbacks
  • Detaillierte Analyse von MySQL-Datenbanktransaktionen und -Sperren
  • Wird die Tabelle durch ein Update in einer MySQL-Transaktion gesperrt?
  • Tiefgreifendes Verständnis von verteilten PHP+MySQL-Transaktionen und -Lösungen
  • Wie implementiert MySQL ACID-Transaktionen?
  • Warum MySQL große Transaktionen vermeiden sollte und wie man sie löst
  • Detaillierte Erläuterung des Persistenzimplementierungsprinzips von Transaktionen in MySQL

<<:  So fügen Sie img-Bilder in Vue-Seiten ein

>>:  Detaillierte Erklärung der Unterschiede und Verwendungen von Linux-System-Shutdown-Befehlen

Artikel empfehlen

Anfänger lernen einige HTML-Tags (1)

Anfänger können HTML lernen, indem sie einige HTM...

Detaillierte Erklärung der JavaScript-Array-Deduplizierung

Inhaltsverzeichnis 1. Array-Deduplizierung 2. Ded...

Vue muss Wissenspunkte lernen: die Verwendung von forEach()

Vorwort Bei der Frontend-Entwicklung stoßen wir h...

Detaillierte Erklärung zum schnellen Erstellen einer Blog-Website mit Docker

Inhaltsverzeichnis 1. Vorbereitung 2. Bereitstell...

Freigabe der schnellen Wiederherstellungslösung für große MySQL-SQL-Dateien

Vorwort Bei der Verwendung einer MySQL-Datenbank ...

So konfigurieren Sie /var/log/messages im Ubuntu-Systemprotokoll

1. Problembeschreibung Heute muss ich die Systemp...

Vue implementiert WebSocket-Kundendienst-Chatfunktion

In diesem Artikel wird hauptsächlich die Implemen...

So greifen Sie über die IP-Adresse auf MySql zu

1. Melden Sie sich bei MySQL an: mysql -u root -h...

MySQL 5.6 Installationsschritte mit Bildern und Text

MySQL ist ein Open-Source-Verwaltungssystem für k...

So verstehen Sie die Dateninteraktion und -anzeige im Vue-Frontend und -Backend

Inhaltsverzeichnis 1. Technischer Überblick 2. Te...

Detailliertes Tutorial zur schnellen Installation von Zookeeper in Docker

Docker: Zookeeper schnell installieren Ich habe Z...

js zur Implementierung der Kollisionserkennung

In diesem Artikelbeispiel wird der spezifische Co...

5 Möglichkeiten, Docker-Container auf andere Server zu migrieren

Migration ist in vielen Fällen unvermeidlich. Har...