@ivanrudenko321

Параллельные запрос как уязвимость?

Имеется интернет магазин. Есть кнопка купить товар, если открыть кликер, например, и одновременно нажать в двух окнах на кнопку - купить товар, отработает 2 запроса, даже если денег хватает только на первый. Подскажите как называется эта уязвимость и какой метод исправления этой проблемы ? Возможно есть готовый пакет.
  • Вопрос задан
  • 189 просмотров
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Эта проблема к браузерам не имеет никакого отношения. Это можно рассмотреть как несогласованность транзакций при работе с балансом пользователя. Если развивать идею то так можно и 2 кредита взять.
Воспроизвести ее можно и без бразуеров.

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

Гипотетический код на несуществующем языке который делает блокирование баланса перед проверкой.
boolean withdraw(account : Long, amount : Decimal) : boolean = {
  with(account.lock()) {
    if (account.balance >= amount) {
      account = account - amount;
      return true;  
    } else {
      return false;
    }
  }
}

И код на SQL (ближе к Oracle-диалекту).

SELECT amount FROM accounts WHERE accountID = :accountId FOR UPDATE;

UPDATE ... 

COMMIT ...;
Ответ написан
Комментировать
iMedved2009
@iMedved2009
Не люблю людей
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы