Laravel队列中的afterCommit

t0ybt7op  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(296)

当我收到请求时,我正在调度执行耗时任务的作业。例如,当用户在网站上注册时,向用户发送欢迎电子邮件
然而,该请求在事务中调度电子邮件作业,并且发生竞争条件。作业可能在事务提交之前执行,因此会因未找到用户错误而失败。我读到在调度作业时使用afterCommit,但文档说“Laravel将等待直到所有打开的数据库事务都已提交,然后才实际调度作业”
这是否意味着如果有多个事务从不同的请求打开,Laravel将等待它们全部关闭,或者只关闭与当前请求相关的可能生成作业的事务?

mftmpeh8

mftmpeh81#

据我所知,laravel将等待创建作业的特定事务,如果该事务是子事务,则laravel将等待父事务提交。希望这个答案对您有所帮助。

rjee0c15

rjee0c152#

如果您不想为整个队列设置'after_commit' => true,并且您只需要一次性的解决方案来在事务之后分派作业,您可以尝试使用DB::afterCommit()钩子。

DB::transaction(function () {
  // some processing

  DB::afterCommit(fn () => \App\Jobs\TestJob::dispatch());

  // some other processing if needed
})

仅当事务已提交且未回滚时,才会分派作业。

相关问题