Laravel - la utilización de transacción y la cola de grandes volúmenes de datos

Tengo 2 tablas. Los datos se pueden insertar en la primera tabla. Pero el segundo puede tener 999999 registros a ser insertado. Así que Porque están relacionados el uno al otro, yo solía DB::beginTransaction() que han integrado los datos. Sin embargo, porque hay un montón de registros para ser insertado a la segunda tabla, así que yo quería ponerlos en cola a fin de no poner la presión en el servidor. Ahora el problema es que si I DB::commit() tras el envío de la cola de trabajo, va a cometer y otros trabajos, que son el resto de inserción de registros no se ejecuta. Si I DB::commit() dentro de la clase de trabajo, no va a funcionar porque la primera vez que se ejecuta cometer, no se ejecutará el segundo tiempo.

Entonces, ¿cómo puedo insertar montón de datos mediante la transacción y en la cola de trabajo?

Mi 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
fuente
0 respuestas

Vea otras preguntas sobre etiquetas