Laravel - Utilisant à la fois la transaction et de la file d'attente pour le big data

J'ai 2 tables. Les données peuvent être insérées dans le premier tableau. Mais la seconde on peut avoir 999999 enregistrements à insérer. Parce qu'ils sont liés les uns aux autres, j'ai utilisé de DB::beginTransaction() intégration de données. Cependant, parce qu'il y a beaucoup de rapports pour être inséré dans le deuxième tableau, j'ai donc voulu mettre en file d'attente afin de ne pas mettre la pression sur le serveur. Maintenant, le problème est que si j' DB::commit() après l'envoi de tâches en file d'attente, il va s'engager et d'autres emplois qui sont le reste de l'insertion d'enregistrements ne fonctionnent pas. Si j' DB::commit() à l'intérieur de la classe d'emploi, il ne fonctionnera pas parce que la première fois qu'il est commis, il ne s'exécute pas une deuxième fois.

Alors, comment puis-je insérer des tas de données à l'aide de la transaction et les tâches en file d'attente?

Mon code:

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
source
0 réponses

Voir d'autres questions sur les étiquettes