Wenn Sie sich der Transaktionsbehandlung (Autocommit, explizit und implizit) für Ihre Datenbank bewusst sind, müssen Sie möglicherweise keine Daten aus einer Sicherung wiederherstellen.
Transaktionen steuern Datenmanipulationsanweisungen, um sicherzustellen, dass sie atomar sind. "Atomic" zu sein bedeutet, dass die Transaktion entweder stattfindet oder nicht. Die einzige Möglichkeit, den Abschluss der Transaktion an die Datenbank zu signalisieren, ist die Verwendung einer Anweisung COMMIT
oder ROLLBACK
(gemäß ANSI-92, das leider keine Syntax zum Erstellen / Starten einer Transaktion enthielt, sodass diese herstellerspezifisch ist). COMMIT
wendet die im Rahmen der Transaktion vorgenommenen Änderungen (falls vorhanden) an. ROLLBACK
ignoriert alle Aktionen, die innerhalb der Transaktion stattgefunden haben - sehr wünschenswert, wenn eine UPDATE / DELETE-Anweisung etwas Unbeabsichtigtes tut .
In der Regel werden einzelne DML-Anweisungen (Einfügen, Aktualisieren, Löschen) in einer Autocommit-Transaktion ausgeführt. Sie werden festgeschrieben, sobald die Anweisung erfolgreich abgeschlossen wurde. Dies bedeutet, dass es keine Möglichkeit gibt, die Datenbank auf den Status zurückzusetzen, bevor die Anweisung in Fällen wie Ihrem ausgeführt wurde. Wenn etwas schief geht, besteht die einzige verfügbare Wiederherstellungsoption darin, die Daten aus einer Sicherung zu rekonstruieren (sofern eine vorhanden ist). In MySQL ist autocommit auf standardmäßig für InnoDB - MyISAM unterstützt keine Transaktionen. Es kann deaktiviert werden mit:
SET autocommit = 0
Eine explizite Transaktion liegt vor, wenn Anweisungen in einen explizit definierten Transaktionscodeblock eingeschlossen werden - für MySQL alsoSTART TRANSACTION
. Es erfordert auch eine explizite Abgabe COMMIT
oder ROLLBACK
Erklärung am Ende der Transaktion. Verschachtelte Transaktionen gehen über den Rahmen dieses Themas hinaus.
Implizite Transaktionen unterscheiden sich geringfügig von expliziten. Implizite Transaktionen erfordern keine explizite Definition einer Transaktion. Wie bei expliziten Transaktionen muss jedoch eine COMMIT
oder ROLLBACK
-Erklärung angegeben werden.
Fazit
Explizite Transaktionen sind die idealste Lösung - sie erfordern eine Erklärung COMMIT
oder ROLLBACK
, um die Transaktion abzuschließen, und was passiert, ist klar angegeben, damit andere es lesen können, wenn es nötig ist. Implizite Transaktionen sind in Ordnung, wenn Sie interaktiv mit der Datenbank arbeiten. COMMIT
Anweisungen sollten jedoch erst angegeben werden, wenn die Ergebnisse getestet und gründlich als gültig bestimmt wurden.
Das heißt, Sie sollten verwenden:
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;
... und nur verwenden, COMMIT;
wenn die Ergebnisse korrekt sind.
Allerdings geben UPDATE- und DELETE-Anweisungen normalerweise nur die Anzahl der betroffenen Zeilen zurück, nicht bestimmte Details. Konvertieren Sie solche Anweisungen in SELECT-Anweisungen und überprüfen Sie die Ergebnisse, um die Richtigkeit sicherzustellen, bevor Sie die UPDATE / DELETE-Anweisung ausführen.
Nachtrag
DDL-Anweisungen (Data Definition Language) werden automatisch festgeschrieben - sie erfordern keine COMMIT-Anweisung. IE: Anweisungen zum Erstellen oder Ändern von Tabellen, Indizes, gespeicherten Prozeduren, Datenbanken und Ansichten.
SET autocommit = 0;
ist nur eine Präferenz, um nicht zu vergessen, Transaktionen zu verwendenSTART TRANSACTION
, muss ich auch explizit angebenCOMMIT
, dass Autocommit aktiviert ist. Ist es?In InnoDB haben Sie
START TRANSACTION;
, was in dieser Engine die offiziell empfohlene Methode zum Ausführen von Transaktionen ist, anstattSET AUTOCOMMIT = 0;
(nichtSET AUTOCOMMIT = 0;
für Transaktionen in InnoDB verwenden, es sei denn, es dient zur Optimierung von schreibgeschützten Transaktionen). Commit mitCOMMIT;
.Vielleicht haben Sie verwenden möchten ,
SET AUTOCOMMIT = 0;
in InnoDB zu Testzwecken und nicht gerade für Transaktionen.In MyISAM haben Sie nicht
START TRANSACTION;
. In dieser EngineSET AUTOCOMMIT = 0;
für Transaktionen verwenden. Festschreiben mitCOMMIT;
oderSET AUTOCOMMIT = 1;
(Unterschied im folgenden MyISAM-Beispielkommentar erläutert). Auf diese Weise können Sie auch in InnoDB Transaktionen durchführen.Quelle: http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_autocommit
Beispiele für Transaktionen mit allgemeiner Verwendung:
/* InnoDB */ START TRANSACTION; INSERT INTO table_name (table_field) VALUES ('foo'); INSERT INTO table_name (table_field) VALUES ('bar'); COMMIT; /* SET AUTOCOMMIT = 1 might not set AUTOCOMMIT to its previous state */ /* MyISAM */ SET AUTOCOMMIT = 0; INSERT INTO table_name (table_field) VALUES ('foo'); INSERT INTO table_name (table_field) VALUES ('bar'); SET AUTOCOMMIT = 1; /* COMMIT statement instead would not restore AUTOCOMMIT to 1 */
quelle
https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
Die korrekte Verwendung von LOCK TABLES und UNLOCK TABLES mit Transaktionstabellen wie InnoDB-Tabellen besteht darin, eine Transaktion mit SET autocommit = 0 (nicht START TRANSACTION) gefolgt von LOCK TABLES zu beginnen und UNLOCK TABLES erst aufzurufen, wenn Sie die Transaktion festschreiben ausdrücklich. Wenn Sie beispielsweise in Tabelle t1 schreiben und aus Tabelle t2 lesen müssen, können Sie Folgendes tun:
SET autocommit=0; LOCK TABLES t1 WRITE, t2 READ, ...;... do something with tables t1 and t2 here ... COMMIT; UNLOCK TABLES;
quelle
autocommit=0
aber nicht mitSTART TRANSACTION
? Es scheint mir völlig willkürlich. Gibt es einen technischen Grund?Wenn Sie Rollback verwenden möchten, verwenden Sie Transaktion starten und sonst alle diese Dinge vergessen,
Standardmäßig schreibt MySQL die Änderungen automatisch in die Datenbank.
Führen Sie Folgendes aus, um MySQL zu zwingen, diese Änderungen nicht automatisch festzuschreiben:
SET autocommit = 0; //OR SET autocommit = OFF
So aktivieren Sie den Autocommit-Modus explizit:
SET autocommit = 1; //OR SET autocommit = ON;
quelle