队列中写入数据重复的问题是什么原因造成的

1. 运行环境

1). 当前使用的 Laravel 版本?

Laravel 5.6

2). 当前使用的 php/php-fpm 版本?

PHP 版本:PHP7.3

3). 当前系统

Centos7

4). 业务环境

生产环境,没有使用负载均衡,单服务器,单数据库

5). 相关软件版本

MySQL5.7

2. 问题描述?

项目中有一个批量从其他平台获取数据的功能,使用队列做的,但是执行过程中偶尔会发生订单重复写入的问题,

代码里没有复杂功能,就是一个遍历数组然后根据第三方id判断是否存在订单,不存在就写入,就不贴代码里

但是偶尔会有订单重复写入,而且一看数据写入时间一模一样,就很困惑

特来寻求下大神们的帮助,感谢

3. 您期望得到的结果?

不会出现重复写入数据的情况

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5

这原因很简单,就是你的数据幻读了。

什么原因我也不分析,只说解决方案:

在 MySql 操作中,把 Select 查询三方 ID 不存在时加锁,避免其他进程占用,伪代码:

if(Order::whereNotExist('order_id', $order_id) {
    if(Redis::setNX($order_id, time()) {
          DB:: beginTransaction()
          Order::insert($data)
          DB::commit();
          Redis::del($order_id)
    }
    throw new Exception('订单已存在')
}
1年前 评论
SuperKev1n (楼主) 1年前
JUSTDOITNICK 1年前
JUSTDOITNICK 1年前

用redis的分布式锁,或者表直接加订单号的唯一索引

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!