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:
-
begynde transaktionen
-
lås brugerindtastningen, så parallelle processer blokeres
SELECT * FROM user FOR UPDATE WHERE id = :id
-
tjek kontosaldoen igen og smid undtagelse / tilbagerulning, hvis der ikke er tilstrækkelige midler
-
lås den vare, der skal bookes, for at forhindre overbooking
SELECT * FROM room FOR UPDATE WHERE id = :id
-
gentjek booking tilgængelighed og smid undtagelse / rollback, hvis varen allerede er booket
-
oprette reservationspost og trække penge fra brugerens konto
-
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.