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 anzeigenmysql> 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. TransaktionIn 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 TransaktionenTransaktion starten oder beginnen Begehen Rollback 3. Von MYSQL unterstützte Engines (InnoDB)Motoren anzeigen; 4. AutoCommit und VervollständigungEs 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. Verifizierungsbeispielmysql> 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:
|
<<: So fügen Sie img-Bilder in Vue-Seiten ein
>>: Detaillierte Erklärung der Unterschiede und Verwendungen von Linux-System-Shutdown-Befehlen
Installationsumgebung: CentOS7 64-Bit-Mini-Versio...
Anfänger können HTML lernen, indem sie einige HTM...
Inhaltsverzeichnis 1. Array-Deduplizierung 2. Ded...
Vorwort Bei der Frontend-Entwicklung stoßen wir h...
Inhaltsverzeichnis 1. Vorbereitung 2. Bereitstell...
Vorwort Bei der Verwendung einer MySQL-Datenbank ...
1. Problembeschreibung Heute muss ich die Systemp...
In diesem Artikel wird hauptsächlich die Implemen...
1. Melden Sie sich bei MySQL an: mysql -u root -h...
MySQL ist ein Open-Source-Verwaltungssystem für k...
Inhaltsverzeichnis 1. Technischer Überblick 2. Te...
Docker: Zookeeper schnell installieren Ich habe Z...
Der Weg vor uns ist immer so schwierig und voller...
In diesem Artikelbeispiel wird der spezifische Co...
Migration ist in vielen Fällen unvermeidlich. Har...