我们有一个带有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,
],
答案 0 :(得分:0)
基本 - 不是
您可能会发现FIFO兼容的队列驱动程序的实现
为了这个目的,laravel有接口Illuminate \ Console \ Scheduling \ Mutex,byt yuo需要扩展queueManager才能使用它