【发布时间】:2019-03-21 13:57:38
【问题描述】:
我们像这样使用 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();
一切正常,我在提交之前尝试了一些“睡眠(20)”并发送了另一个申请(没有睡眠)并且该行确实被锁定,但是我们面临一个问题。当我们从 cron 多次运行它时,似乎该函数运行在完全相同的毫秒上,然后锁似乎不起作用,这可能吗?除了使用队列,还有其他解决方案吗?
CRON 只是像这样多次调用路由:
* * * * * curl http://test.com.br/test
* * * * * curl http://test.com.br/test
* * * * * curl http://test.com.br/test
【问题讨论】:
标签: mysql laravel laravel-5 transactions pessimistic-locking