php - 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,
],
解决方案
基本上 - 不是
你可能会发现 FIFO 兼容队列驱动程序 laravel 的实现为此目的具有接口 Illuminate\Console\Scheduling\Mutex,你需要扩展 queueManager 才能使用它
推荐阅读
- c++ - 在 Visual Studio Code 中使用 Visual Studio C++ 项目
- ios - 不会让我将字符串数组传递给类属性吗?
- java - 多次使用Stream后的空地图
- java - Java AmazonS3 putObject 静默失败
- java - 在运行时刷新 @Resource 和 @Autowired bean
- postgresql - 在列表中查找项目,然后显示这些值
- visual-studio - 如何在 Visual Studio 中复制源文件
- c - 防止算术溢出
- tensorflow - InvalidArgumentError:无法为操作 replica_0/lambda_1/Shape 分配设备
- docker - 在 Docker 堆栈文件中覆盖来自 Dockerfile 的 COPY 命令