Advanced MySQL - Referentielle Integrität - Transaktionen - Funktionsweise
1. Starten, übermitteln oder zurückrollen
Nach diesem Prinzip läuft alles ab. Zuerst beginnt man eine Transaktion und dann kommen die entsprechenden SQL-Statements. Wenn alles sauber durchgelaufen ist, werden die Abfragen sozusagen verewigt, ansonsten stellt man wieder den Ursprungszustand her.
2. Starten
Dazu gibt es zwei Möglichkeiten, die in der Wirkung aber völlig identisch sind.
START TRANSACTION;
# oder
BEGIN;
3. Anweisungen
Als nächstes kommen dann die entsprechenden SQL-Statements, die zu einen "Block" zusammengefasst sind. Wichtig sind allerdings nur
DELETE
-, UPDATE
-, REPLACE
- oder INSERT
-Anweisungen. Reine Selects sind bei Transaktionen
überflüssig wie ein Kropf(f).
4. Fallunterscheidung
Das ist eigentlich ganz einfach. Wenn alles in Ordnung ist, verewigt man die Abfragen mit COMMIT
, ansonsten stellt man den
Ursprungszustand mit ROLLBACK
wieder her.
Ein Hinweis
Die Fallunterscheidung kann man nicht direkt mit SQL treffen, dazu benötigt man eine darüber liegende Programmschicht.
# Wenn alles in Ordnung
COMMIT;
# Ansonsten
ROLLBACK;
5. Ganz wichtig
Nehmen wir mal kleines Beispiel. Wir haben ein Login-System programmiert, wo der Benutzername die Mail-Adresse ist. Um Doppelungen
zu vermeiden, wurde die Spalte als UNIQUE KEY
festgelegt. Jetzt lesen wir meinetwegen diese Daten aus einer csv-Datei
aus und wollen sie in der entsprechenden Tabelle abspeichern.
BEGIN;
INSERT INTO user (username) VALUES('mail@peterkropff.de');
INSERT INTO user (username) VALUES('info@peterkropff.de');
INSERT INTO user (username) VALUES('mail@peterkropff.de');
COMMIT;
So, hier wird es genau dann knallen, wenn zum zweiten Mal(!) versucht wird bei username
die Mail-Adresse
mail@peterkropff.de
einzutragen. Dann kommt der dezente Hinweis SQL Error (1062) Duplicate entry ...
.
Also merken. Mit Transaktionen kann man keine Fehler abfangen. Und sollte es auch nicht.
6. Autocommit
Dieser Modus ist meiner Meinung nach für reine SQL-Statements erst mal unerheblich. Wichtig wird er aber im Zusammenhang mit PHP. Also, es gibt bei MySQL zwei Möglichkeiten, wie mit Queries verfahren wird. Standardmäßig ist der Autocommit-Modus aktiviert. Das heißt, dass Änderungen direkt in die Datenbank geschrieben werden.
Deaktiviert man dagegen diesen Modus über SET AUTOCOMMIT=0;
, so müssen alle(!) Änderungen mit COMMIT
bestätigt
werden. Denn sonst landen sie nur temporär in der Datenbank und werden nicht dauerhaft gespeichert. Ein START TRANSACTION
oder BEGIN
dagegen setzt das normalerweise aktivierte Autocommit nur so lange außer Kraft bis die Transaktion mit COMMIT
oder ROLLBACK
abgeschlossen wurde.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt