我需要在交易中触发laravel作业。
由于作业是异步的,因此有时它们会在事务提交之前完成。在这种情况下,作业无法使用ID获取相关的原始文件。 (因为该事务尚未提交,并且外部看不到更改)
[除了将这部分放在事务之外,还建议一种方法来解决此问题。
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()
我最近在一个项目中解决了这个问题。
用dispatch()
方法简单地定义了一个“缓冲”外观单例,该方法不是立即分派它,而是将作业缓冲在内存中直到事务提交。
构造'buffer'类时,它为提交和回滚事件注册一个事件侦听器,并根据触发的事件来调度或忘记缓冲的作业。
它会在实际事务级别上进行其他一些巧妙的处理,并确定是否需要立即缓冲或分派。
希望您能理解,但如果您想让我进一步介绍,请告诉我。