Laravel - Usando tanto a transação e a fila para grandes volumes de dados

Eu tenho 2 tabelas. Os dados podem ser inseridos para o primeiro quadro. Mas o segundo poderia ter 999999 registros a serem inseridos. Isso Porque eles são relacionados uns com os outros, eu usei DB::beginTransaction() para ter integrado de dados. No entanto, porque há muitos registros de lá para ser inserido para a segunda tabela, então eu queria fila-los, a fim de não colocar pressão sobre o servidor. Agora, o problema é que se eu DB::commit() após a expedição de fila de trabalho, ele irá consolidar e outros trabalhos que são o resto de inserção de registros não será executado. Se eu DB::commit() dentro do trabalho de classe, ele não vai funcionar porque a primeira vez que é executado em flagrante, ele não será executado segundo tempo.

Então, como eu posso inserir bando de dados, utilizando a transação e trabalho na fila?

O meu código:

DB::beginTransaction();
try {
    $tableOne = new ModelOne();
    $tableOne->column_one = 'value x';
    $tableOne->save();

    $recordsToBeInserted = User::all();
    if(count($recordsToBeInserted) > 500) {
        JobOne::dispatch($recordsToBeInserted);
    } else {
        foreach($recordsToBeInserted as $record) {
            ModelTwo::create([
                'column_one' => 'value y',
                'table_one_id' => $tableOne->id,
            ]);
        }

        DB::commit();
    }

    return 'success!';
} catch (Exception $e) {
    DB::rollback();

    return 'Err!';
}


class JobOne implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $recordsToBeInserted;

    public function __construct($recordsToBeInserted)
    {
        $this->recordsToBeInserted = $recordsToBeInserted;
    }

    public function handle()
    {
        foreach($this->recordsToBeInserted->chunk(500) as $record) {
            ModelTwo::create([
                'column_one' => 'value y',
                'table_one_id' => $record->id,
            ]);
        }

        DB::commit();
    }
}
0
2019-09-17 08:20:07
origem
0 respostas

Veja mais perguntas por marcas