Wenn Sie sich der Transaktionsbehandlung (Autocommit, explizit und implizit) für Ihre Datenbank bewusst sind, können Sie sich das Wiederherstellen von Daten aus einer Sicherung ersparen.
Transaktionen steuern die Datenmanipulationsanweisung(en), um sicherzustellen, dass sie atomar sind. "Atomisch" 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 eines COMMIT
oder ROLLBACK
-Anweisung (gemäß ANSI-92, die leider keine Syntax zum Erstellen/Beginn einer Transaktion enthielt, sodass sie herstellerspezifisch ist). COMMIT
wendet die Änderungen (falls vorhanden) an, die innerhalb der Transaktion vorgenommen wurden. ROLLBACK
ignoriert alle Aktionen, die innerhalb der Transaktion stattgefunden haben - sehr wünschenswert, wenn eine UPDATE/DELETE-Anweisung etwas Unbeabsichtigtes tut .
Typischerweise werden einzelne DML-Anweisungen (Insert, Update, Delete) in einer Autocommit-Transaktion ausgeführt – sie werden festgeschrieben, sobald die Anweisung erfolgreich abgeschlossen wurde. Das bedeutet, dass es in Fällen wie Ihrem keine Möglichkeit gibt, die Datenbank auf den Zustand zurückzusetzen, bevor die Anweisung ausgeführt wurde. Wenn etwas schief geht, besteht die einzige verfügbare Wiederherstellungsoption darin, die Daten aus einem Backup (sofern vorhanden) zu rekonstruieren. In MySQL ist autocommit ein 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 sind - für MySQL ist das START TRANSACTION
. Es erfordert auch ein explizit gemachtes COMMIT
oder ROLLBACK
Erklärung am Ende der Transaktion. Verschachtelte Transaktionen sprengen den Rahmen dieses Themas.
Implizite Transaktionen unterscheiden sich geringfügig von expliziten. Implizite Transaktionen erfordern keine explizite Definition einer Transaktion. Wie explizite Transaktionen erfordern sie jedoch ein COMMIT
oder ROLLBACK
Erklärung geliefert werden.
Schlussfolgerung
Explizite Transaktionen sind die ideale Lösung - sie erfordern eine Anweisung COMMIT
oder ROLLBACK
, um die Transaktion abzuschließen, und was passiert, wird klar angegeben, damit andere es lesen können, falls dies erforderlich sein sollte. Implizite Transaktionen sind in Ordnung, wenn Sie interaktiv mit der Datenbank arbeiten, aber COMMIT
Aussagen sollten nur spezifiziert werden, nachdem die Ergebnisse getestet und gründlich als gültig bestimmt wurden.
Das heißt, Sie sollten Folgendes verwenden:
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;
...und nur COMMIT;
verwenden wenn die Ergebnisse korrekt sind.
Allerdings geben UPDATE- und DELETE-Anweisungen normalerweise nur die Anzahl der betroffenen Zeilen zurück, keine spezifischen Details. Wandeln Sie solche Anweisungen in SELECT-Anweisungen um und überprüfen Sie die Ergebnisse, um vorher die Korrektheit sicherzustellen zum Versuch der UPDATE/DELETE-Anweisung.
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.