首页 > 解决方案 > Laravel Queue 是否防止并发请求插入重复记录?

问题描述

我们有一个带有 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,
],

标签: phplaravel

解决方案


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


推荐阅读