sql >> Database teknologi >  >> RDS >> PostgreSQL

Samtidighedsscenarier med INSERT'er

Dit problem bunder i spørgsmålet om "hvad skal synkroniseringslåsen være" . Ud fra dit spørgsmål ser det ud til, at bookingen ikke er booking af en bestemt vare. Men lad os antage, at en bruger reserverer et specifikt hotelværelse, så du skal løse to problemer:

  • forhindre overbooking (f.eks. at booke det samme for to personer)
  • forhindre fejlberegning af parallel kontotilstand

Så når en bruger kommer til et punkt, hvor han/hun er ved at trykke på bekræft knappen, er dette et muligt scenarie, du kan implementere:

  1. begynde transaktionen

  2. lås brugerindtastningen, så parallelle processer blokeres

    SELECT * FROM user FOR UPDATE WHERE id = :id

  3. tjek kontosaldoen igen og smid undtagelse / tilbagerulning, hvis der ikke er tilstrækkelige midler

  4. lås den vare, der skal bookes, for at forhindre overbooking

    SELECT * FROM room FOR UPDATE WHERE id = :id

  5. gentjek booking tilgængelighed og smid undtagelse / rollback, hvis varen allerede er booket

  6. oprette reservationspost og trække penge fra brugerens konto

  7. commit transaktion (alle låse frigives)

Hvis du i dit tilfælde ikke behøver at tjekke for overbooking, skal du bare springe over / ignorere trin 4 og 5.



  1. en permanent måde at gøre mysqli->set_charset() på?

  2. Selvstudium til SQL joins

  3. MySQL til Visual Studio installation mislykkes, fejlkode 1603

  4. Du kan ikke angive måltabellen 'NAME' til opdatering i FROM-klausulen