#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...
}
Вы можете зафиксировать свою транзакцию в любом из цепных заданий.