Hauptmenü

Untermenü

Advanced MySQL - Referentielle Integrität - Transaktionen

1. Das Problem

Ihr habt folgende Situation sicher schon alle mal erlebt. Man will in einem Rutsch eine Menge Datensätze in eine Datenbank schreiben. Leider hat man da an einer Stelle gepennt und das Ergebnis ist nicht so, wie es sein soll. Nun, das liegt schlicht und ergreifend daran, dass MySQL jede Abfrage sofort ausführt.

Leider ist dies in bestimmten Situationen ein wenig heikel. Nehmen wir mal ein einfaches Beispiel. Unser Konto! So, jetzt wollen wir unsere allmonatliche Miete überweisen. Das könnte dann zum Beispiel so aussehen.


SELECT 
  id 
FROM 
  konto
WHERE pin '****';

Als nächstes wird dann der entsprechende Betrag abgezogen. PS: das mit den 500 ist reines Wunschdenken meinerseits.


UPDATE 
  konto
SET 
  kohle kohle 500
WHERE id 5;

Und zu guter Letzt wird mein sauer verdientes Geld auf das Konto des Vermieters überwiesen.


UPDATE 
  konto
SET 
  kohle kohle 500
WHERE blz = *****
  AND ktonr = *****;

2. Aber!

Was ist, wenn die Kontonummer oder Bankleitzahl des Vermieters falsch ist? Dann ist mein Geld futsch. Oder was passiert, wenn ich zum Beispiel meinen Dispokredit damit überzogen hätte? Und so was geht ja schon mal gar nicht. Sagen zumindest die Leute von der Bank.

Die Lösung

Damit hier alles mit rechten Dingen zugeht, muss man mit einer so genannten atomaren Operation arbeiten. Die funktioniert nach dem Prinzip "alles oder nichts". Dabei werden alle SQL-Statements zusammengefasst und wenn es an einer Stelle hakt, dann muss der Ursprungszustand wiederhergestellt werden. Ach ja, der Begriff "atomare Operation" wird im MySQL-Handbuch in einen anderen Zusammenhang genannt. Ich selber beziehe mich dagegen auf das allgemeine ACID-Prinzip.

3. Transaktionen

Wie ihr unschwer erkennen könnt, lässt sich das geschilderte Problem damit lösen. Allerdings funktioniert das nur bei Tabellen vom Typ InnoDb. Leider bietet uns MySQL nicht(!) die Möglichkeit, so was über reine Abfragen zu erledigen. Dazu bedarf es zusätzlich einer Programmiersprache wie PHP. Darauf werde ich aber in einen geplanten Tutorial eingehen. Beim nächsten Abschnitt geht es nur um die grundsätzliche Funktionsweise.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt