Альтернативный подход может заключаться в том, чтобы не зарезервировать запас при помещении его в корзину. Выполняйте проверку каждый раз, когда страница перезагружается, если элемент больше не доступен, отобразите сообщение типа «Элемент, который вы хотите купить, только что распродан. Он будет доступен в ближайшее время». И вы удаляете товар из корзины.
Теперь вам абсолютно необходимо зарезервировать содержимое корзины покупок непосредственно перед началом операции оплаты, а затем либо удалить ее со склада, либо удалить резерв в зависимости от успешности / неудачи платежа. Вы делаете это лучше за один прогон кода, так что резерв длится как можно короче.
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 начинает с корзины покупок, товар зарезервирован, CustomerB приходит, видит, что товара нет на складе и уходит, CustomerA решает, что ему не нравится цена, и отменяет операцию У вас было два потенциальных клиента, но вы не могли продать ни одному.