SWEBB
@SWEBB
Software Developer

Как обеспечить консистентность при чтении?

Здравствуйте! Интересует решение вопроса в API сервисе со стеком:
- NodeJS 10
- MongoDb 4.00
- Mongoose ODM

Суть такова: сервис по бронированию мест в отеле предоставляет доступность номеров . Но если в 1 секунду или менее 2 пользователя забронируют последнее место , то бронь сработает сразу у двоих , поскольку первый запрос на доступ к брони отработает быстрее , чем второй , который вычтет и сохранит. Например:

На 1 место претендуют два человека и в ту же секунду оформляют оба одновременно. Выполняется у обоих чтение доступных мест и у обоих последнее место доступно . Но у первого бронь срабатывает раньше и место обновляется ,(read=1-1) - запишешься 0(не доступно) у второго точно также. Получается оба забронировали 1 место.

Я думаю копать нужно в Монго чтобы настроить консистентность. Как вы думаете?
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
@res2001
Developer, ex-admin
При записи брони в селекторе дополнительно проверяйте условие, чтоб место все еще было доступно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Копать надо в сторону ACID транзакций, блокировок записей и обновлений записей с условиями. (На примере SQL: update table set free = 0 where id=1 and free =1 and updated =13677742126)

Моего вроде в ACID научилась в последних релизах
Ответ написан
Комментировать
@de1m
Была похожая ситуация только с логами, которые тоже писались в базу. Тут надо делать очередь, то есть всё закидывается в очередь и каждый в очереди проверяет, свободное ли место.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы