Hauptmenü

Untermenü

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 (usernameVALUES('mail@peterkropff.de');
INSERT INTO user (usernameVALUES('info@peterkropff.de');
INSERT INTO user (usernameVALUES('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