Используя 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 было запущено до завершения предыдущего, оно не будет запускать или не выбирать те же записи.
Решил эту проблему с помощью транзакции & lockForUpdate:
DB::beginTransaction();
$records = DB::table('jobs')->where('finished', '=', 0)->lockForUpdate()->get();
// process
DB::commit();
Других решений пока нет …