Эта проблема к браузерам не имеет никакого отношения. Это можно рассмотреть как несогласованность транзакций при работе с балансом пользователя. Если развивать идею то так можно и 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 ...;