Laravel lockForUpdate + транзакция - PullRequest
0 голосов
/ 21 марта 2019

Мы используем lockForUpdate следующим образом:

DB::beginTransaction();

try {
    $balance = UserBalance::where('user_id', 2)
                    ->lockForUpdate()
                    ->first();
    $balance->usd += 100;
    $balance->save();

    // A LOT MORE LOGIC HERE

    $balance = UserBalance::where('user_id', 7)
                    ->lockForUpdate()
                    ->first();
    $balance->usd -= 100;
    $balance->save();

} catch (\Exception $e) {
    DB::rollback();
    return json_encode ([
        'success' => false,
        'message' => 'error',
    ]);
}
DB::commit();

Все в порядке, я попытался с каким-то "sleep (20)" перед фиксацией и отправил другую заявку (без сна), и строка действительнозаблокирован, но мы столкнулись с проблемой.Когда мы запускаем это из cron несколько раз, кажется, что функция запускается в одну и ту же миллисекунду, тогда блокировка не работает, возможно ли это?Есть ли другое решение вместо использования очереди?

CRON просто вызывает маршрут несколько раз, как это:

* * * * * curl http://test.com.br/test
* * * * * curl http://test.com.br/test
* * * * * curl http://test.com.br/test

1 Ответ

0 голосов
/ 21 марта 2019

Я не понимаю, почему здесь нужно использовать DB::transcation, поскольку эта операция атомарная.

Вы можете просто сделать UserBalance::where('user_id', 2)->increment('usd', 100).

Это отправит один запрос на сервер, увеличив значение usd на 100.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...