Транзакции базы данных Laravel в цепных очередях (Horizon / Redis)

#php #laravel #laravel-5 #laravel-queue #laravel-horizon

#php #laravel #laravel-5 #laravel-queue #laravel-horizon

Вопрос:

Я искал это часами и думаю, что, возможно, это просто невозможно? Если задание в моей цепочке очередей завершается с ошибкой, могу ли я откатить все транзакции базы данных, которые произошли до этого момента.

 DB::transaction(function () {
   ProcessPodcast::withChain([
       new OptimizePodcast,
       new ReleasePodcast
   ])->dispatch();
});
 

примечание: Я знаю, что вышеприведенное не будет работать при асинхронной отправке заданий в очередь, но есть ли способ получить этот эффект?

Ответ №1:

Поскольку рабочие очереди являются долговременными процессами, можно использовать транзакции базы данных в цепных заданиях очереди.

Что вам нужно сделать, так это начать транзакцию по ProcessPodcast handle методу job, убедившись, что вы выполняете откат в случае сбоя цепочки.

 // ProcessPodcast parent Job

use DB; // above class, of course

public function handle()
{
    DB::beginTransaction();
}

public function failed(Exception $exception)
{
    DB::rollback();
    // Send user notification of failure, etc...
}
 

Вы можете зафиксировать свою транзакцию в любом из цепных заданий.