Как работать с большим количеством запросов?

В базе есть у пользователя определенная сумма средств. По запросу фронта ты эту сумму увеличиваешь на 10 рублей и более ее увеличивать нельзя, но если выполнить ботом сразу же 1000 запросов, то сумма увеличится на 10 тысяч рублей и будет закрыта только через какое-то время. Как это исправить?
  • Вопрос задан
  • 664 просмотра
Пригласить эксперта
Ответы на вопрос 5
Использовать транзакцию и выполнять блокировку строки таблицы на запись перед увеличением значения
Ответ написан
@StiflerProger
Просто каждый запрос делай в транзакции с "select for update".
1. Сразу после получения запроса ставишь блок "select for update".
2. Проводишь валидацию данных. Проверяешь оплату в другой таблице и тп.
3. Добавляешь 10 рублей юзеру.

Если у тебя юзер может даже после этого добавить себе 1000 раз по 100 рублей, то проблема в шаге #2.
Т.е. твой момент с "более ее увеличивать нельзя" должен проверяться в шаге #2.
Ответ написан
Комментировать
samodum
@samodum
Какой вопрос - такой и ответ
но если выполнить ботом сразу же 1000 запросов, то сумма увеличится на 10 тысяч рублей

Такое возможно, если код писал джуниор и вылил в продакт без ревью лидом. Но если у джуна такие права на CI/CD, то тут вопросы к менеджменту и админам
Ответ написан
inoise
@inoise
Solution Architect, AWS Certified, Serverless
Очереди. По сути есть 2 варианта:
  • Простой. Мы создаем очередь и в ней обрабатываем последовательно все операции одним обработчиком без масштабирования. Подойдет для старта на небольших нагрузках
  • Сложный. К простому варианту добавляем слово Kafka и партицирование по ключу клиента чтобы команды от одного клиенты попадали в одну партицию топика. Надо иметь больше опыта, но зато на больших объемах отлично масштабируется
Ответ написан
добавить признак / колонку в БД «больше обновлять нельзя».
При обновлении проверять этот признак и устанавливать его в положение «баста»:
UPDATE accounts 
SET money = money + 10, isUpdateable = false
WHERE id = :uid 
  AND isUpdateable = true
Успешное обновление прикрывает лавочку.

В вопросе стоило уточнить, конечно, что за «база» – вдруг это и не SQL, а кластер Redis на множестве узлов.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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