Laravel队列是否防止并发请求插入重复记录?

时间:2018-04-27 14:49:14

标签: php laravel

我们有一个带有MariaDB数据库的Laravel API,我们遇到了由并发请求创建的数据库中重复记录的问题。

我们假设实现队列可以通过一次处理一个请求来解决这个问题。 但我们仍有同样的重复记录问题。

在应用程序中,我们有一个查找重复项的检查,但当然这对于同时创建相同记录的并发请求不起作用。

我们无法在数据库级别使用唯一约束,部分原因是由于Laravel的软删除机制,部分原因是复杂的业务逻辑应该允许重复,如果其中一个字段的值与某组值匹配。

我们使用Redis作为队列驱动程序。

认为队列应该阻止这些问题我们错了吗? 或者我们在某处实现队列时犯了错误?

这是控制器的简化版本:

class CreateRecordJob extends Job implements SelfHandling
{

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function handle()
    {
        $data = $this->data;

        // check if we have this record in the database already
        if(!$this->hasDuplicate($data)) {
            $this->createRecord();
        }
    }
}

在config / queue.php中,我们将Redis设置为默认队列驱动程序:

'default' => env('QUEUE_DRIVER', 'redis'),

在config / queue.php中我们也有这个用于redis连接:

'redis' => [
    'driver'     => 'redis',
    'connection' => 'default',
    'queue'      => 'default',
    'expire'     => 60,
],

1 个答案:

答案 0 :(得分:0)

基本 - 不是
您可能会发现FIFO兼容的队列驱动程序的实现 为了这个目的,laravel有接口Illuminate \ Console \ Scheduling \ Mutex,byt yuo需要扩展queueManager才能使用它