Laravel 4.2阻止查询同时运行

时间:2016-02-25 20:09:01

标签: php laravel laravel-4 cron race-condition

使用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作业在前一个作业完成之前就已经开始,那么就不会运行或不选择相同的记录。

1 个答案:

答案 0 :(得分:2)

使用交易和解决方案解决了这个问题lockForUpdate:

DB::beginTransaction();
$records = DB::table('jobs')->where('finished', '=', 0)->lockForUpdate()->get();
// process
DB::commit();