laravel下新增数据,偶尔会有重复数据

1.公司要实现一个业务逻辑:一天一个手机号码phone只能提交一次订单。
目前这个业务逻辑不涉及高并发等场景,大概也就是几分钟一次订单;

2.在编写了简单的表单验证之后,使用laravel5.4有如下代码;

/**
     * 临时订单生成
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws ApiException
     */
    public function AdvertisementUserOrder(Request $request){

        PcUserValidator::GcCheCkAdvertisement(1001);//表单验证

        $temporay_order = DB::select('select id from o2o_temporary_order where to_days(created_at) = to_days(now()) and phone = :phone', [':phone'=>$request->phone]);
        if ($temporay_order) {
            throw new ApiException(3020, '今天已申请过订单,请等待处理!');
        }
        //判断来源是否正确
        $source = config('constants.user.source');
        if ($request->has('source')){
            if (count($source) >= $request->input('source') && $request->input('source') > 0){
                $source_input = $request->input('source');
            }else{
                $source_input = 1;
            }
        }else{
            $source_input = 1;
        }
            $temporay = DB::insert('insert into o2o_temporary_order (phone, username, source,created_at,updated_at) values (?, ?, ?,?,?)',
                [$request->phone, $request->username, $source_input, date('Y-m-d H:i:s', time()), date('Y-m-d H:i:s', time())]);

            if (!$temporay){
                throw new ApiException(3020,'添加失败');
            }

        return $this->success();

    }

3.在本地经过简单的表单测试后一切正常上线;

4.问题出现在数据库会在某种情况下出现数据重复录入,但前台js已经做好了重复提交等功能,而且就算是重复提交了,这时候第二次请求应该会被return;

5.数据库相关
图片描述

6.为了模拟类似的情况发生,用linux做了定时任务,建了一个临时表用相同的代码每分钟访问一次接口。发现并不会出现重复的数据

阅读 5.9k
3 个回答
一天一个手机号码phone只能提交一次订单

可以从数据库的设计方面进行调整

根据业务逻辑,手机号和天 这两个字段需要联合唯一

在表中新增 the_data 字段,字段的值是 这行记录插入时的日期(如20171219),将手机号字段 和 天数字段 联合唯一,就可以完全杜绝一天内重复提交的可能了

可以在表单验证里完成,代码:

public function rules() {
    return [
        'phone' => [
            'required',
            'string',
            'size:11',
            'regex:/^1[3-8]{1}[0-9]{9}$/',
            Rule::unique('o2o_temporary_order')->where(function ($query) {
                    $query->whereDate('created_at', today()->toDateString());
                })
         ],
         //其它
     ];
}

public function messages() {
    return [
        'phone.unique' => '今天已申请过订单,请等待处理!'
    ];
}

文档

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题