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