当我收到请求时,我正在调度执行耗时任务的作业。例如,当用户在网站上注册时,向用户发送欢迎电子邮件然而,该请求在事务中调度电子邮件作业,并且发生竞争条件。作业可能在事务提交之前执行,因此会因未找到用户错误而失败。我读到在调度作业时使用afterCommit,但文档说“Laravel将等待直到所有打开的数据库事务都已提交,然后才实际调度作业”这是否意味着如果有多个事务从不同的请求打开,Laravel将等待它们全部关闭,或者只关闭与当前请求相关的可能生成作业的事务?
afterCommit
mftmpeh81#
据我所知,laravel将等待创建作业的特定事务,如果该事务是子事务,则laravel将等待父事务提交。希望这个答案对您有所帮助。
rjee0c152#
如果您不想为整个队列设置'after_commit' => true,并且您只需要一次性的解决方案来在事务之后分派作业,您可以尝试使用DB::afterCommit()钩子。
'after_commit' => true
DB::transaction(function () { // some processing DB::afterCommit(fn () => \App\Jobs\TestJob::dispatch()); // some other processing if needed })
仅当事务已提交且未回滚时,才会分派作业。
2条答案
按热度按时间mftmpeh81#
据我所知,laravel将等待创建作业的特定事务,如果该事务是子事务,则laravel将等待父事务提交。希望这个答案对您有所帮助。
rjee0c152#
如果您不想为整个队列设置
'after_commit' => true
,并且您只需要一次性的解决方案来在事务之后分派作业,您可以尝试使用DB::afterCommit()钩子。仅当事务已提交且未回滚时,才会分派作业。