PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Scénarios de concurrence avec INSERT

Votre problème se résume à la question de "quel devrait être le verrou de synchronisation" . D'après votre question, il semble que la réservation ne soit pas la réservation d'un article spécifique. Mais supposons qu'un utilisateur réserve une chambre d'hôtel spécifique, vous devez donc résoudre deux problèmes :

  • éviter les surréservations (par exemple, réserver la même chose pour deux personnes)
  • éviter les erreurs de calcul de l'état du compte parallèle

Ainsi, lorsqu'un utilisateur arrive à un point où il est sur le point d'appuyer sur confirmer bouton, voici un scénario possible que vous pouvez mettre en œuvre :

  1. commencer la transaction

  2. verrouiller l'entrée de l'utilisateur afin que les processus parallèles soient bloqués

    SELECT * FROM user FOR UPDATE WHERE id = :id

  3. revérifiez le solde du compte et lancez une exception/annulation si les fonds sont insuffisants

  4. verrouiller l'article à réserver pour éviter la surréservation

    SELECT * FROM room FOR UPDATE WHERE id = :id

  5. revérifiez la disponibilité de la réservation et lancez une exception/annulation si l'article est déjà réservé

  6. créer une entrée de réservation et soustraire des fonds du compte de l'utilisateur

  7. valider la transaction (tous les verrous seront libérés)

Si, dans votre cas, vous n'avez pas besoin de vérifier la surréservation, ignorez simplement les étapes 4 et 5.