Alex: MySQL - LOCK TABLES - Reservierungssystem

Beitrag lesen

Hallo Leute,

ich habe mal wieder eine Frage.

Zuerstmal mein Thema an sich, um zu sehen, ob ich überhaupt das richtige Problem anspreche, oder ob es vielleicht einen anderen Ausweg gibt:

Ich baue ein Reservierungssystem. Bei einer Reservierung muss man ein paar Daten angeben. Dann wir man weitergeleitet und muss bezahlen. Vor der Weiterleitung (an PayPal) speichert das System die Reservierung mit dem Status "pending" (DB-Feld "pending" Wert 1).

Wenn man von PayPal wiederkommt wird erstmal gecheckt, ob die Zahlung geklappt hat. Wenn ja sollen die PayPal-Infos in die DB und der Status "pending" soll auf 0 gesetzt werden.

Soweit alles kein Problem. Aber: Meistens ist die Zahl der Reservierungen begrenzt. Also kann ich nicht einfach pending=0 setzen und fertig sondern ich muss checken, ob ich noch im vorgegebenen Rahmen bin.

Das mache ich im Moment so, dass ich erstmal für den Termin abfrage, wie viele Reservierungen schon mit dem Status "pending=0" vorhanden sind.

Dann schaue ich, ob die alten Reservierungen + die neuen kleiner oder gleich der Höchstzahl sind.

Wenn JA: Dann wird pending auf 0 gesetzt und die Reservierung ist komplett.

Jetzt zu meiner Frage:
Das ist glaube ich schon alles so richtig und sollte klappen. Das Problem ist nur, dass ja ein anderer User, beim dem das irgendwie schneller geht, in der Zwischenzeit auch seine Reservierung durchzieht und es dann eine Überbuchung gibt, oder?

Ich glaube, das kann man mit LOCK TABLES lösen, habe mir dazu auch schon ein bisschen durchgelesen aber verstehe es noch nicht so ganz.

Ich habe erkannt, dass man mit LOCK TABLES sowohl bei WRITE als auch bei READ andere User von allen Aktionen aussperrt. Wenn ich also während die Tabelle gesperrt ist in einem anderen Browserfenster z.B. den Termin aufrufe, in dem auch auf die Reservierungstabelle zugegriffen wird, um die Anzahl auszulesen, wartet das ab, bis die Tabelle entsperrt ist.

Das ist schon irgendwie nicht so gut, weil eben die ganzen Termin-Seiten und nicht nur die Reservierung dran hängen.

In meinem Testbeispiel ist es besonders krass, weil ich zum testen sleep für 30 Sekunden genutzt habe. Wie wirkt sich das in echt aus, kann das spürbar werden.

Oder wie sollte man sowas generell machen?

Gruß
Alex