Задать вопрос
@ikerya

Как защититься от мультизапросов (Charles)?

Приведу пример: допустим, нужно сделать чат, в котором отправка одного сообщения платная и составляет 1 рубль (первое условие). Второе условие заключается в том, что пользователю нельзя отправлять подряд более двух сообщений.

То есть, алгоритм отправки сообщения состоит в следующем:

1. Проверить, не отправил ли уже пользователь 2 сообщения, если отправил, выдать ошибку, иначе:
2. Снять средства с баланса (1 рубль), если средств недостаточно, выдать ошибку, если же достаточно, то:
3.Добавить сообщение в базу.

Проблема состоит в том, что при проверках запросы могут не успеть выполниться и пару запросов пройдет проверку и проскочит сквозь ограничения, пока старые запросы будут "заканчивать своё выполнение".

Данная ситуация лишь пример, и не стоит концентрироваться только на чате. Разберем пример с онлайн-рулеткой:

В одной комнате играет несколько пользователей (неважно количество). Лимит на сумму ставки -- от 10 до 50 рублей. Максимальное количество ставок за один раунд -- 5 ставок.

То есть, в данном примере также нужно сделать несколько проверок, чтобы потом добавить ставку в базу. Если ставка не успеет добавиться, а уже следующий запрос начнет выполняться, то в этом время проверка на количество ставок не будет пройдена корректно и лимит ставок может быть нарушен.

Подскажите, пожалуйста, что делать в этой ситуации?
  • Вопрос задан
  • 86 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 2
@Mercury13
Программист на «си с крестами» и не только
Транзакции и блокировка строк. Точка.
https://ru.wikipedia.org/wiki/Уровень_изолированно...
https://dev.mysql.com/doc/refman/8.0/en/innodb-tra...

Вам вроде нужен самый сильный уровень изоляции транзакций, SERIALIZABLE.

Более сложный, но более высокопроизводительный способ — SELECT FOR UPDATE.
https://dev.mysql.com/doc/refman/8.0/en/innodb-loc...
Тут уровень изолированности транзакций не важен, поскольку вы сами выбираете, какую строку как изолировать.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Либо составлять атомарный запрос, который не выполнится при нарушении каких-либо условий, либо использовать блокировки таблиц.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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