Uw probleem komt neer op de vraag "wat moet de synchronisatievergrendeling zijn" . Uit uw vraag blijkt dat de boeking niet het boeken van een specifiek item is. Maar laten we aannemen dat een gebruiker een specifieke hotelkamer boekt, dus je moet twee problemen oplossen:
- overboeking voorkomen (bijvoorbeeld hetzelfde boeken voor twee personen)
- voorkom misrekening van parallelle accountstatus
Dus wanneer een gebruiker op een punt komt waarop hij/zij op het punt staat bevestigen . te drukken knop, dit is een mogelijk scenario dat u kunt implementeren:
-
transactie starten
-
vergrendel de gebruikersinvoer zodat parallelle processen worden geblokkeerd
SELECT * FROM user FOR UPDATE WHERE id = :id
-
controleer het saldo van de rekening opnieuw en gooi uitzondering / terugdraaiing als er onvoldoende saldo is
-
vergrendel het te boeken item om overboeking te voorkomen
SELECT * FROM room FOR UPDATE WHERE id = :id
-
controleer de beschikbaarheid van de boeking opnieuw en gooi uitzondering / terugdraaien als het item al is geboekt
-
maak boekingsinvoer en trek geld af van de gebruikersaccount
-
transactie vastleggen (alle vergrendelingen worden vrijgegeven)
Als u in uw geval niet hoeft te controleren op overboeking, kunt u stap 4 en 5 gewoon overslaan/negeren.