使用laravel 4.2,我有一个每分钟运行一次的Cron作业,它以与此类似的方式从数据库中获取作业列表:
$records = DB::table('jobs')->where('finished', '=', 0)->
whereBetween('created_at', [Carbon::now(),Carbon::now()->addMinutes(2)])->get();
// Process records
..
完成后,它会将“已完成”字段更新为1.
现在由于cron作业每分钟都在运行,我需要确保如果cron作业在前一个作业完成之前就已经开始,那么就不会运行或不选择相同的记录。
答案 0 :(得分:2)
使用交易和解决方案解决了这个问题lockForUpdate:
DB::beginTransaction();
$records = DB::table('jobs')->where('finished', '=', 0)->lockForUpdate()->get();
// process
DB::commit();