Двойная бронь выглядит безобидно: две записи на 14:00 к одной мастерице. Последствия не безобидны: один клиент уйдёт, а мастерица узнает об этом, когда оба стоят на пороге.
Откуда берётся щель
Сохранение записи устроено как «прочитал → записал»: сначала проверяем, свободно ли время, потом сохраняем. Между этими двумя действиями проходят миллисекунды, но два администратора, нажавшие «Сохранить» одновременно, успевают оба пройти проверку. Каждый видел свободное время, и каждый был прав: на момент проверки оно было свободно.
Никакой интерфейс этого не решает. Решает база данных.
Блокировка на мастера
Перед проверкой запись берёт именованную блокировку в базе: «бронирование: компания такая-то, мастер такой-то». Второе сохранение к тому же мастеру ждёт, пока первое отпустит блокировку, и только потом проверяет время. Проверка теперь видит первую запись и отказывает.
Блокировка держится не дольше 5 секунд. Если за 5 секунд получить её не удалось, сохранение возвращает ошибку «попробуйте ещё раз»: держать запрос дольше ради одного слота нет смысла, а 5 секунд в нормальной работе не случаются никогда.
Один лок на все пути
Записи создаются из четырёх мест: форма в CRM, перетаскивание в календаре, онлайн-запись клиента и внутренние сервисы, например лист ожидания. Блокировка одна и та же для всех. Раньше у онлайн-записи была своя блокировка, а у CRM никакой, и получалось, что клиент на сайте и администратор в CRM всё равно могли занять одно время: защита работала только между двумя клиентами сайта.
Поэтому имя блокировки во всех путях совпадает. Это и есть вся суть: не «более умная проверка», а одна очередь для всех, кто хочет это время у этого мастера.
Что это значит на практике
Два администратора жмут «Сохранить» одновременно: у одного запись создаётся, второй видит «время занято» и выбирает другое. Клиент на сайте и администратор конкурируют так же. Задержки вы не заметите: блокировка живёт десятки миллисекунд.
Если всё же увидели «попробуйте ещё раз», просто повторите: это значит, что база была занята дольше 5 секунд, и лучше повторить, чем получить две записи.
Комментарии
Комментариев пока нет. Задайте вопрос — отвечаем в течение суток.