PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Сценарии за паралелност с INSERT

Вашият проблем се свежда до въпроса "какво трябва да бъде заключването на синхронизацията" . От въпроса ви изглежда, че резервацията не е резервация на конкретен артикул. Но нека приемем, че потребител резервира конкретна хотелска стая, така че трябва да решите два проблема:

  • предотвратяване на свръхрезервиране (напр. резервиране на едно и също нещо за двама души)
  • предотвратяване на грешно изчисляване на състоянието на паралелния акаунт

Така че, когато потребител стигне до момент, в който е на път да натисне потвърди бутон, това е възможен сценарий, който можете да приложите:

  1. започнете транзакцията

  2. заключете потребителския запис, така че паралелните процеси да бъдат блокирани

    SELECT * FROM user FOR UPDATE WHERE id = :id

  3. проверете отново баланса на сметката и хвърлете изключение / връщане назад, ако няма достатъчно средства

  4. заключете артикула за резервиране, за да предотвратите свръхрезервиране

    SELECT * FROM room FOR UPDATE WHERE id = :id

  5. проверете отново наличността на резервацията и изхвърлете изключение / връщане назад, ако артикулът вече е резервиран

  6. създайте запис за резервация и извадете средства от сметката на потребителя

  7. извършване на транзакция (всички ключалки ще бъдат освободени)

Ако във вашия случай не е необходимо да проверявате за свръхрезервация, просто пропуснете/игнорирайте стъпки 4 и 5.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използвайте двоична таблица COPY FROM с psycopg2

  2. Как да избегнем рекурсия в тригер за актуализация, който извършва актуализация?

  3. Как мога да прикача база данни към приложение в Heroku?

  4. PostgreSQL Upsert с клауза WHERE

  5. CommandError:Изглежда, че нямате инсталирана програма 'psql' или на вашия път