Advanced MySQL - Referentielle Integrität - Transaktionen - Ein Beispiel
1. Das liebe Geld
Hier greife ich mal auf das Beispiel in der Einführung zurück. Um denn nun eine Überweisung sauber auszuführen, könnte man so vorgehen. Wir haben die folgende Tabelle (bitte keine Rückschlüsse auf meine finanzielle Situation ziehen, die sieht viel besser aus). Außerdem sollte man so etwas nie aufbauen, aber hier geht es nur um das Grundsätzliche. Außerdem lasse ich die Sache mit der PIN mal weg.
+--+--------------+--------+------+--------+----------+
|id|name |blz |ktonr |kohle |dispo |
+--+--------------+--------+------+--------+----------+
| 1|Peter Kropff |12345678|987654|-3500.96| -3800.50|
| 2|Mein Vermieter|87654321| 1265|55000.00|-150000.00|
+--+--------------+--------+------+----------+--------+
2. Die Überweisung
Leider kann man Transaktionen nicht verschachteln. Also muss alles in einem Rutsch geschehen.
BEGIN;
UPDATE konto SET kohle = kohle - 500 WHERE id = 1;
UPDATE konto SET kohle = kohle + 500 WHERE blz = 87654321
AND ktonr = 1265;
3. Die Überprüfung
Wie ich schon sagte, liegt die Programmlogik nicht bei MySQL. Darum muss man hier zum Beispiel mit PHP arbeiten. Ich selber erkläre die Vorgehensweise mal anhand von Pseudocode. Aber Geduld, entsprechende Tutorials dazu sind verfügbar.
BEGIN;
...
SELECT kohle, dispo FROM konto WHERE id = 1;
[IF kohle < dispo]
ROLLBACK;
[ELSEIF Ergebnis zweites UPDATE == 0]
ROLLBACK;
[ELSE]
COMMIT;
Erläuterung
Das hier ist nur eine(!) Möglichkeit, wie man hier mit einer sauberen Transaktion arbeiten kann. Weitere Varianten zeige ich euch später mal. Konzentrieren wir uns hier auf den Pseudocode.
Also, es wurden beide UPDATE
-Statements ausgeführt. Dann sucht man nach meinem Kontostand und überprüft, ob die Kohle
noch für den Dispo ausreicht. Wenn nicht, wird das ROLLBACK
gestartet und beide Aktionen rückgängig gemacht. Ansonsten
wird noch überprüft, ob das Geld auch tatsächlich auf dem Konto des Vermieters angekommen ist. Wenn es da einen Fehler gab, wird auch
alles in seinen Ursprungszustand versetzt, wenn nicht so wird die Transaktion mit COMMIT
abgeschlossen.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt