在 Laravel 中将事务与队列相结合

use*_*986 6 php queue transactions laravel laravel-5.1

有没有办法告诉队列外观不要自动保留推送到队列的内容,直到我专门告诉它为止?

Queue::noPersist()
Queue::push()
Queue::push()
Queue::persist()
Run Code Online (Sandbox Code Playgroud)

看到我的问题如下,我的代码执行被包装在一个事务中。

在此输入图像描述

在该事务中,添加了一些雄辩的记录,并且紧接着将作业推送到队列中。

队列在事务提交之前运行:问题是队列有时在事务完成之前开始运行,因此它尝试引用尚未“提交”的记录。

如果我的设计没问题,我想我真正需要的是队列仅在事务成功提交后提交:可以这么说,如果事务失败,那么作业也应该回滚。或者换句话说,在事务成功之前不应推送作业。

队列延迟我看到 laravel 有一个延迟,我可以添加到队列中,但我不想在那里破解一个随机数,因为这有点脆弱,我真的只想在事务成功时才提交队列。

有什么指导或内置功能可以帮助我解决这个问题吗?

DB::transaction(function() {
    // add record A to DB
    // add JOB to QUEUE (this job starts firing before transaction commits and fails finding the record A)
    // more operations
});
Run Code Online (Sandbox Code Playgroud)

Den*_*nko 3

提交发生在你的闭包函数之后,所以如果你继续使用这个结构 - 你将无法在提交后入队。

然而,Laravel 有另一种方式来进行事务(请参阅Laravel 文档中的“手动使用事务” )。你可以这样做:

$errors = false;

try {
  DB::beginTransaction();

  // All your operations here
} catch (Exception $e) {
  $errors = true;
  DB::rollBack();
}

if (!$errors) {
  DB::commit();

  // Add to queue
}
Run Code Online (Sandbox Code Playgroud)

  • 如果事务已成功提交,但添加到队列失败怎么办? (2认同)
  • 我认为这与 OP 发布的结构没有任何不同。闭包方法就像这样处理事务,但可以方便地为您运行提交或回滚(如果抛出异常)。这是语法糖。 (2认同)