Начать работу с транзакцией [PHP Laravel]

Мне нужно запустить работу Laravel в рамках транзакции.

Поскольку задания асинхронные, иногда они завершаются до фиксации транзакции. В таких ситуациях задание не может получить соответствующее сырье, используя идентификатор. (Поскольку транзакция еще не зафиксирована и изменения не видны извне)

Пожалуйста, предложите метод, отличный от размещения этой части вне транзакции, чтобы решить эту проблему.

DB::beginTransaction()

...

$process = DB::table("trn_users")->insertGetId([
    "first_name" => $first_name,
    "last_name" => $last_name
]);

$job = (new SendEmailJob([
    'Table' => 'trn_users',
    'Id' => $process
]))->onQueue('email_send_job');
$this->dispatch($job);

...

DB:commit()

0 ответов

Для этого я опубликовал пакет http://github.com/therezor/laravel-transactional-jobs

Другой вариант - использовать события:

DB::beginTransaction()

...

$process = DB::table("trn_users")->insertGetId([
    "first_name" => $first_name,
    "last_name" => $last_name
]);

$job = (new SendEmailJob([
    'Table' => 'trn_users',
    'Id' => $process
]))->onQueue('email_send_job');

Event::listen(\Illuminate\Database\Events\TransactionCommitted::class, function () use ($job) {
      $this->dispatch($job);
});


...

DB:commit()

Я недавно решил эту проблему в проекте.

Просто определил синглтон "буферного" фасада с dispatch(), который вместо немедленной отправки буферизует задания в памяти до фиксации транзакции.

Когда создается класс "буфер", он регистрирует прослушиватель событий для событий фиксации и отката и либо отправляет, либо забывает буферизованные задания, в зависимости от того, какое событие запускается.

Он делает некоторые другие умные вещи вокруг фактического уровня транзакции и определяет, нужно ли ему немедленно буферизовать или отправлять.

Надеюсь, вы уловили идею, но дайте мне знать, если вы хотите, чтобы я подробно рассказал.

Другие вопросы по тегам