Фреймворк Laravel - как и очереди транзакций для больших данных

У меня есть 2 таблицы. Данные можно ввести в первую таблицу. Но второй, возможно, 999999 записей, которые будут вставлены. Потому, что они связаны друг с другом, я использовал аличие интегрированных данных. Однако, потому что есть много записей здесь должен быть вставлен во второй таблице, поэтому я хотел бы очереди за ними, чтобы не давить на сервере. Теперь проблема в том, что если я DB::commit() после отправки задания в очередь, он будет совершать и другие задания, которые остальные вставку записей не будет работать. Если я в классе задание, он не будет работать, потому что первый раз она проходит совершении, он не будет работать второй раз.

Так как я могу вставить кучу, используя данные транзакции и в очередь на работу?

Мой код:

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
источник
0 ответов

Посмотрите другие вопросы по меткам