Ответ 1
Альтернативный подход может заключаться в том, чтобы не запасать запас при помещении его в корзину покупок. Выполняйте проверку каждый раз, когда страница перезагружается, если элемент больше не доступен, отобразите сообщение типа "Предмет, который вы хотите купить, только что был распродан, он будет доступен в ближайшее время". И вы удаляете продукт из корзины.
Теперь вам абсолютно необходимо зарезервировать содержимое корзины покупок прямо перед началом операции оплаты, либо либо удалить ее из запаса, либо удалить резервную копию в зависимости от успеха/отказа платежа. Вы делаете это лучше в одном прогоне кода, чтобы резерв длился как можно короче.
ProcessOrder ()
{
bool reserved = ReserveShoppingCartContents ();
if (reserved)
{
bool paymentStatus = ProcessPayment ();
if (paymentStatus)
RemoveShoppingCartContentsFromStock ();
else
ReleaseShoppingCartReserve ();
}
else
{
RefreshShoppingCartContents (); // Remove positions or adjust quantities
MessageBox ("Could not reserve your shopping cart contents. Please check out your selection");
}
}
Чем выше ваш запас, тем выше вероятность того, что ваш товар будет продан. Вы минимизируете возможность конфликта: CustomerA начинается с корзины покупок, товар становится зарезервированным, приходит Клиент, видит, что товар отсутствует на складе и уходит, CustomerA решает, что ему не нравится цена и отменяет операцию. У вас было два потенциальных клиента, но они не могли продать.