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

Scenari di concorrenza con INSERT

Il tuo problema si riduce alla domanda "quale dovrebbe essere il blocco della sincronizzazione" . Dalla tua domanda sembra che la prenotazione non sia la prenotazione di un articolo specifico. Ma supponiamo che un utente stia prenotando una specifica camera d'albergo, quindi devi risolvere due problemi:

  • prevenire l'overbooking (ad es. prenotare la stessa cosa per due persone)
  • prevenire errori di calcolo dello stato dell'account parallelo

Quindi, quando un utente arriva a un punto in cui sta per premere conferma pulsante, questo è un possibile scenario che puoi implementare:

  1. iniziare la transazione

  2. bloccare la voce dell'utente in modo che i processi paralleli siano bloccati

    SELECT * FROM user FOR UPDATE WHERE id = :id

  3. ricontrolla il saldo del conto e lancia un'eccezione/ripristino se i fondi sono insufficienti

  4. bloccare l'elemento da prenotare per evitare l'overbooking

    SELECT * FROM room FOR UPDATE WHERE id = :id

  5. ricontrolla la disponibilità della prenotazione e lancia un'eccezione/ripristino se l'articolo è già prenotato

  6. crea una voce di prenotazione e sottrai fondi dall'account dell'utente

  7. transazione di commit (tutti i blocchi verranno rilasciati)

Se, nel tuo caso, non hai bisogno di controllare l'overbooking, salta/ignora i passaggi 4 e 5.