Мы используем 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