Hauptmenü

Untermenü

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 kohledispo 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