Начать работу с транзакцией [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()
, который вместо немедленной отправки буферизует задания в памяти до фиксации транзакции.
Когда создается класс "буфер", он регистрирует прослушиватель событий для событий фиксации и отката и либо отправляет, либо забывает буферизованные задания, в зависимости от того, какое событие запускается.
Он делает некоторые другие умные вещи вокруг фактического уровня транзакции и определяет, нужно ли ему немедленно буферизовать или отправлять.
Надеюсь, вы уловили идею, но дайте мне знать, если вы хотите, чтобы я подробно рассказал.