Сценарий гонок
Представьте себе небольшой интернет-магазин, который использует свою собственную валюту.
В базе данных есть таблица предметов, которые можно купить. Количество каждого предмета ограничено. Этот предел хранится в столбце в этой таблице как целое число.
Также есть таблица для денежных счетов пользователя, тогда как для каждой учетной записи сохраняется текущий баланс.
Если, например, два пользователя совершают свои покупки одновременно и доступен только один товар, возможно, что оба пользователя заплатят, но только один человек получит товар из-за условий гонки.
Как можно решить такие гоночные условия, не полагаясь на структуру сущности, которая создает исключения для экономии?
Как я могу обеспечить правильное обновление количества доступных товаров и баланса покупателя?
1 ответ
На самом деле это не проблема, специфичная для Entity Framework, она применима практически к любому сценарию магазина. Это сводится к вопросу политики - единственный способ гарантировать, что два клиента не покупают один и тот же товар, - это разрешить временную блокировку этого товара при добавлении товара в корзину или начать процесс оформления покупки, похоже на то, как продаются билеты на концерт или авиабилеты. Срок действия этой блокировки истечет, если покупка не будет завершена в течение установленного периода времени, и товар будет отпущен для покупки другими покупателями.
В условиях электронной коммерции это не так удобно, так как люди могут добавить товар в свою корзину и не оформить заказ, или потратить дополнительное время на выбор дополнительных товаров. Это может привести к сценарию, в котором у вас есть предметы для продажи, но их нельзя купить, потому что они находятся в корзине, которая не планирует оформлять покупку. Вместо этого допускаются повторяющиеся заказы, но платежи, как правило, только предварительно авторизуются, а затем завершаются в момент отправки или подтверждения заказа, поэтому даже если второй клиент введет все свои данные и нажмет кнопку "Купить", с его карты не будет снята оплата, поскольку Товар не будет отправлен.
Вы можете осуществлять проверки на разных этапах в процессе оформления заказа, чтобы убедиться, что товары в корзине все еще доступны, или на самом простом уровне оставить его для последней кнопки "Оплатить сейчас" на последней странице. В конечном счете, это только уменьшает потенциал для состояния гонки, а не устраняет его.