1UnitedPower: MySQL PDO Datensatz holen und sperren

Beitrag lesen

Hakuna matata!

Benutz am besten Transaktionen.

Wozu sollte es bei einer linearen, nicht verschachtelten Abarbeitung von Datensätzen notwendig sein, Transaktionen ins Spiel zu bringen? Die fangen erst an sinnvoll zu sein, wenn mehrere Datensätze ggf. mehrerer Tabellen im Spiel sind, die sich gegenseitig in die Quere kommen können.

Nein, da irrst du dich. Transaktionen sind dann von Interesse, wenn mehrere _Abfragen_ (nicht Datensätze oder Tabellen) voneinander abhängen, insbesondere wenn eine Schreiboperation von einer zuvor ausgeführten Leseoperation abhängt.

Nehmen wir als Beispiel einen Online-Shop: Es gibt Angebot mit limitierter Auflage, solange der Vorrat reicht. Seien nun noch zwei Produkte übrig, und 5 Kunden schicken gleichzeitig ihre Bestellung ab. Das Bestellskript muss prüfen, ob der Artikel noch vorhanden ist, falls dem nicht so ist, muss eine Fehlermeldung an den Kunden gesandt werden, falls doch, dann muss die Bestellung eingetragen werden und der Lagerbestand muss entsprechend verringert werden. Hier liegt eine Racecondition vor, und zwar zwischen dem Auslesen des aktuellen Lagerbestandes und dem Schreiben des neuen Lagerbestandes. Im schlimmsten Fall bekommen alle 5 Kunden eine Bestellbestätigung und das obwohl nur noch zwei Artikel im Lager sind.

Um die Racecondition zu vermeiden, kann man das Auslesen und das Neuschreiben des Lagerbestandes in einer Transaktion abwickeln.

--
“All right, then, I'll go to hell.” – Huck Finn