sql >> Database >  >> RDS >> PostgreSQL

Gelijktijdigheidsscenario's met INSERT's

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:

  1. transactie starten

  2. vergrendel de gebruikersinvoer zodat parallelle processen worden geblokkeerd

    SELECT * FROM user FOR UPDATE WHERE id = :id

  3. controleer het saldo van de rekening opnieuw en gooi uitzondering / terugdraaiing als er onvoldoende saldo is

  4. vergrendel het te boeken item om overboeking te voorkomen

    SELECT * FROM room FOR UPDATE WHERE id = :id

  5. controleer de beschikbaarheid van de boeking opnieuw en gooi uitzondering / terugdraaien als het item al is geboekt

  6. maak boekingsinvoer en trek geld af van de gebruikersaccount

  7. 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.



  1. Genereer de ERD voor een bestaande database

  2. voeg contacten in de database in maar wil geen reeds bestaand contact dupliceren

  3. Fatale fout opgetreden tijdens het lezen van gegevens

  4. Hoe tabellen te kopiëren en cursors in SQL te vermijden?