#asp.net #asp.net-mvc
#asp.net #asp.net-mvc
Вопрос:
Я делаю платежную онлайн-систему с asp.net mvc1.0, как я могу сделать, чтобы разрешить только одному человеку покупать что-то, когда его запас только один. Кроме того, я использую в этой системе другую платежную систему (например, ebay).Я имею в виду, когда запас одного продукта составляет всего один, и более одного человека могут купить его в один момент, как я могу сделать, чтобы один человек мог купить его успех, а другой больше не мог его покупать.
Ответ №1:
Вероятно, вам потребуется использовать транзакции базы данных для обработки ваших заказов. Речь идет не только о блокировке объекта (который в данном случае должен быть статическим объектом, чтобы им могли пользоваться все веб-пользователи), но и о доступе к полному выполнению заказа. Транзакции будут тем, что вам нужно использовать.
Кроме того, неясно, когда вы говорите: «Я использую другие платежи в этой системе». Это не имеет никакого отношения к транзакционному управлению запасами для продаж.
Комментарии:
1. Это, конечно, предполагает, что вы управляете инвентаризацией запасов в базе данных (что, скорее всего, так и будет). Как сказал Джаред, используйте транзакцию с правильным уровнем изоляции и поместите проверку в запрос обновления.
2. Я имею в виду, что я использую другую платежную систему, такую как ebay, поэтому я больше не могу контролировать, когда веб-сайт перенаправляется на страницу оплаты. когда на складе одного продукта есть только один, но более одного человека, который может купить его в один момент, как я могу сделать, чтобы только один человек мог купить его успех, а другие не могли его купить.
Ответ №2:
Для того, чтобы только один поток имел доступ к критическому методу, вы могли бы использовать блокировку ключа.
lock (myObj)
{
}
если вы ищете что-то большее, вам потребуется больше контекста, чтобы понять это.
Ответ №3:
Вам необходимо добавить в вашу систему управление параллельным доступом. Например, вы можете реализовать этот простой алгоритм:
- Проверьте количество объектов, присутствующих в магазине, которые вы хотите продать
- Уменьшите количество для количества объектов, которые вы хотите продать
- Оплатить объекты
- если платеж в порядке, завершите транзакцию
- если платеж не удался, выполните откат транзакции, увеличьте количество и верните деньги 😉
Важным моментом является пункт 2, обновление количества элементов в хранилище с использованием алгоритма оптимистичной проверки. Например, запишите в условие WHERE вашей операции SQL значение количества, которое вы прочитали в poit 1. Если кто-то изменит это значение, произойдет сбой обновления, и операция продажи должна быть прервана.