PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Parallelitätsszenarien mit INSERTs

Ihr Problem läuft auf die Frage hinaus, "was die Synchronisationssperre sein soll" . Aus Ihrer Frage geht hervor, dass die Buchung keine Buchung eines bestimmten Artikels ist. Aber nehmen wir an, dass ein Benutzer ein bestimmtes Hotelzimmer bucht, also müssen Sie zwei Probleme lösen:

  • Überbuchungen vermeiden (z. B. dasselbe für zwei Personen buchen)
  • Verhindern Sie eine Fehlberechnung des parallelen Kontostatus

Also, wenn ein Benutzer an einen Punkt kommt, an dem er/sie im Begriff ist, auf Bestätigen zu klicken Schaltfläche, dies ist ein mögliches Szenario, das Sie implementieren können:

  1. Transaktion starten

  2. den Benutzereintrag sperren, damit parallele Prozesse blockiert werden

    SELECT * FROM user FOR UPDATE WHERE id = :id

  3. Überprüfen Sie den Kontostand erneut und werfen Sie eine Ausnahme / einen Rollback, wenn das Guthaben nicht ausreicht

  4. den zu buchenden Artikel sperren, um eine Überbuchung zu verhindern

    SELECT * FROM room FOR UPDATE WHERE id = :id

  5. Buchungsverfügbarkeit erneut prüfen und Ausnahme/Rollback auslösen, wenn der Artikel bereits gebucht ist

  6. Buchungseintrag erstellen und Guthaben vom Benutzerkonto abziehen

  7. Commit-Transaktion (alle Sperren werden aufgehoben)

Wenn Sie in Ihrem Fall nicht auf Überbuchung prüfen müssen, überspringen/ignorieren Sie einfach die Schritte 4 und 5.