Описать проблему ↗

Дубли и данные

Два покупателя заказывают последний товар: как защитить остатки

Два покупателя успевают заказать последнюю единицу товара. Объясняем, почему проверки наличия на странице недостаточно и как согласовать резервирование.

Редакция «починимсайт» · Обновлено · 3 мин. чтения

Что происходит и с чего начать

Остаток на витрине показывает состояние на момент просмотра. Пока человек оформляет заказ, другой покупатель может приобрести тот же товар. Поэтому окончательное решение о доступности должно приниматься при согласованном изменении остатка или резерва. Простая последовательность «проверить число, затем уменьшить» может дать ошибку при одновременных запросах. Сначала определите бизнес-правило: когда товар резервируется, сколько держится резерв и что происходит при неоплате. Без этого техническая защита может блокировать продажи неправильно.

Что можно проверить самостоятельно

  1. Сохраните номера конфликтующих заказов, время и идентификатор товара или варианта. Проверьте, действительно ли речь об одном складе и одной единице, а не разных предложениях.
  2. Опишите момент резервирования и освобождения по текущим правилам. Уточните, разрешены ли предзаказ, продажа сверх остатка и ручное подтверждение наличия менеджером.
  3. Сообщите о других каналах продаж и обмене с учётной системой. Если остаток меняется в нескольких местах, локальной защиты сайта может быть недостаточно без согласования источника данных.

Как понять результаты проверки

Разработчик организует атомарную проверку и изменение: конкурирующие операции не должны обе успешно использовать одну доступную единицу. Способ зависит от базы и модели резервов. Но блокировка сама по себе не определяет бизнес-условия: неоплаченный заказ и подтверждённая покупка могут иметь разные сроки удержания товара. Внешние каналы тоже требуют отдельной синхронизации. Отчёт должен объяснять, какой источник считается актуальным и как магазин ведёт себя при неопределённом результате оплаты или задержке обмена.

Что проверяет разработчик

Для этой части понадобятся доступ к настройкам, журналам ошибок или коду. Её можно передать специалисту вместе с результатами предыдущих шагов.

  1. Сопоставьте время заказов и движения остатка. Проверьте, не прочитали ли оба запроса одно и то же доступное количество.
  2. Уточните правила резерва, оплаты и отмены. Остаток может уменьшаться дважды разными обработчиками одного заказа.
  3. Проверьте обмен со складом: новая выгрузка не должна бездумно возвращать количество, которое уже зарезервировано сайтом.

На что обратить внимание

Между проверкой наличия и записью другой процесс успевает продать тот же товар. Клиентская блокировка кнопки не влияет на конкуренцию независимых покупателей.

Как исправляют причину

Используйте атомарное условное изменение или подходящую транзакционную блокировку с проверкой результата. Согласуйте единственный источник истины и правила освобождения резерва при отмене или истечении ожидания.

Как убедиться, что проблема решена

Запустите два одновременных тестовых заказа на последнюю единицу. Один должен получить товар, второй — понятный отказ или предусмотренный предзаказ; отмена должна вернуть резерв ровно один раз.

Проверьте две одновременные попытки на последнюю единицу в тестовой среде. Затем отмену, истечение резерва и успешную оплату. Один покупатель должен получить согласованный результат, другой — понятное объяснение и актуальную корзину. Отдельно проверьте возврат доступности после отмены. Решение не должно сводиться к скрытию товара на витрине, пока прямой запрос оформления всё ещё позволяет продать его повторно.