@JaguXam

Как в ларавель 5.5 заставить mysql обрабатывать запросы по очереди?

Проблема в следующем.

На сайте могут быть 2-3 запроса в секунду от одного пользователя.
В базе есть баланс, когда он нажимает одновременно с милисекундой на кнопку заплатить, списывается только 1 раз, так-как сайт или база не успевают обработать этот запрос, он идет одновременно.

На даннай момент я делаю так, строго не судите это мой первый опыт работы с балансом.
$this->user->money - $amount
$this->user->save();

Можно как-то заставить сайт обрабатывать запросы на изменение балансов по очереди ?
Заранее спасибо за ответ.
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
inoise
@inoise
Solution Architect, AWS Certified, Serverless
И решается это ... барабанная дробь ... очередями! Rabbitmq, Kafka и другими вариантами. Кстати, Хранить баланс прямо в пользователе - плохая идея.

А если хорошо подумать то надо читать про идемпотентные операции и не снимать деньги со счета, а создавать изначально транзакцию и ее закрывать, Ама фоне, асинхронно, пересчитывать баланс
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Alex_Wells
@Alex_Wells
PHP/TS/Kotlin developer
Открываете транзакцию, вытаскиваете юзера с локом ->lockForUpdate(), проводите свои манипуляции/проверки, сейвите, комиттите транзакцию.

DB::transaction(function () use (&$user) {
    $user = User::whereKey($user->getKey())->lockForUpdate()->firstOrFail();
    if ($user->balance) // blabla
    $user->balance -= 100;
    $user->save();
});


Ничего более не нужно.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы