Как синхронизировать некоторые потоки

#asp.net #asp.net-mvc

#asp.net #asp.net-mvc

Вопрос:

Я делаю платежную онлайн-систему с asp.net mvc1.0, как я могу сделать, чтобы разрешить только одному человеку покупать что-то, когда его запас только один. Кроме того, я использую в этой системе другую платежную систему (например, ebay).Я имею в виду, когда запас одного продукта составляет всего один, и более одного человека могут купить его в один момент, как я могу сделать, чтобы один человек мог купить его успех, а другой больше не мог его покупать.

Ответ №1:

Вероятно, вам потребуется использовать транзакции базы данных для обработки ваших заказов. Речь идет не только о блокировке объекта (который в данном случае должен быть статическим объектом, чтобы им могли пользоваться все веб-пользователи), но и о доступе к полному выполнению заказа. Транзакции будут тем, что вам нужно использовать.

Кроме того, неясно, когда вы говорите: «Я использую другие платежи в этой системе». Это не имеет никакого отношения к транзакционному управлению запасами для продаж.

Комментарии:

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

2. Я имею в виду, что я использую другую платежную систему, такую как ebay, поэтому я больше не могу контролировать, когда веб-сайт перенаправляется на страницу оплаты. когда на складе одного продукта есть только один, но более одного человека, который может купить его в один момент, как я могу сделать, чтобы только один человек мог купить его успех, а другие не могли его купить.

Ответ №2:

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

 lock (myObj)
{
}
  

если вы ищете что-то большее, вам потребуется больше контекста, чтобы понять это.

Ответ №3:

Вам необходимо добавить в вашу систему управление параллельным доступом. Например, вы можете реализовать этот простой алгоритм:

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

Важным моментом является пункт 2, обновление количества элементов в хранилище с использованием алгоритма оптимистичной проверки. Например, запишите в условие WHERE вашей операции SQL значение количества, которое вы прочитали в poit 1. Если кто-то изменит это значение, произойдет сбой обновления, и операция продажи должна быть прервана.