Почему двойная бронь невозможна
Два гостя нажали «Забронировать» одновременно — место получит ровно один.
Самая неприятная ошибка в бронировании — два гостя на одном месте в одно время. Проверки «свободно ли?» перед записью для этого недостаточно: между проверкой и записью успевает вклиниться другой запрос.
Как это устроено
Запрет на пересечение живёт в самой базе данных, а не в коде приложения. База физически не даёт записать вторую бронь, чьё время пересекается с уже занятым на том же месте — с учётом буфера. Даже если два запроса пришли в одну и ту же миллисекунду, один из них получит отказ.
Места с ёмкостью больше одной
Там, где одновременных броней может быть несколько (прокат, групповое занятие), пересечения законны, и место считается по-другому: система пересчитывает занятые места в защищённой транзакции и отказывает только когда свободных не осталось.
Обновлено