Rolf b: MySQL: "unique"-artig, über mehrere Datensätze:-|

Beitrag lesen

Das wirst Du über eine Transaktion machen müssen. Das Folgende ist Pseudocode, den Du nach vollständiger SQLifizierung in eine Stored Procedure (=MySQL Routing) packen könntest. Du musst natürlich noch einen Erfolgscode zurückgeben.

Kritisch ist es nur, wenn Du demjenigen, der die Seite zuerst aufrief, Priorität geben willst. Das klappt damit nicht, es ist eine Art Windhundprinzip: Wer zuerst "verbindlich buchen" drückt, bekommt den Tisch.

Und je nach Isolationsstufe der Transaktion kann es auch ärgerliche Kollisionen geben: User 1 bucht 7 Plätze, User 2 bucht 5 Plätze. Beide machen den Insert, beide bekommen die Meldung "Tisch voll", beide fliegen raus. User 3 kommt, bucht 6 Plätze und dreht beiden die Nase.

Wenn Du sowas verhindern willst, musst Du vermutlich einen Reservierungs-Timestamp hinzufügen, erstmal blind INSERTen und dann nachprüfen was passiert ist. Wird die Anzahl überschritten, werden beginnend mit der jüngsten alle Buchungen entfernt, die zur Überschreitung führten. Das löst aber mehr Aufwand in der DB aus.

BEGIN TRANSACTION
   INSERT (Tischnummer, AnzPlätze) Value (?, ?)

   SELECT SUM(AnzPlätze) WHERE Tischnummer = ?

   IF (summe <= maxPlätze)
      COMMIT
   ELSE
      ROLLBACK

END TRANSACTION

Rolf