Как работать с одновременными запросами?

Есть функция A и в ней есть пару запросов в базу и работа с счетом юзера. Но когда много одновременных запросов скрипт работает как хочет, т.е скрипт не успевает обрабатывать счет (списание денег) юзера ... Как можно исправить ситуацию?

\DB::beginTransaction();
if($user->money < 100) return false;
try {
$user->money = $user->money - 100;
$user->save();
\DB::commit();
} catch (\Exception $e) {
\DB::rollback();
dd($e);
}
Что то не так работает
  • Вопрос задан
  • 225 просмотров
Решения вопроса 1
Alex_Wells
@Alex_Wells
PHP/Kotlin
DB::transaction(function() use ($user) {
    $user->money -= 100;
    $user->save();
});


В чем проблема то?

PS: фасад не забудьте
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@ollisso
В зависимости от логики.

1. Транзакции
2. Снимать и проверять одновременно:
Update table set money=money-10 where user=123 and money>=10
И проверка кол-ва строк измененных
Ответ написан
Комментировать
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
для начала поправить код,
$use->money = $user->money - 100;
пишите в блокноте? Любая нормальная IDE подсвечивает такой косяк.

В случае одновременных записей и косяков с ними связанных есть лок таблиц и лок строк. Это решение не очень хорошее, но иногда единственно возможное.
Ответ написан
AmdY
@AmdY
PHP и прочие вебштучки
User::where('money',  '>', 100)
    ->update('money', \DB::raw('money - ?', 100));

Плюс плюс посмотрите в сторону локов https://laravel.com/docs/5.3/queries#pessimistic-l...
Ответ написан
Ваш ответ на вопрос

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

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