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

0 0 mysql laravel php
╰╮妖言惑众
╰╮妖言惑众

声望值:50 0人

2019-01-22 16:53:15 提问

关注 0关注

收藏 0收藏, 255浏览

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做了定时任务,建了一个临时表用相同的代码每分钟访问一次接口。发现并不会出现重复的数据

请先 登录 后评论

3个回答

  • c语言我最爱157声望 2018-09-25 09:28

    可以在表单验证里完成,代码: 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' => '今天已申请过订单,请等待处理!' ]; } 文档
    请先 登录 后评论
  • 豌豆の豆98声望 2018-09-25 09:31

    一天一个手机号码phone只能提交一次订单 可以从数据库的设计方面进行调整 根据业务逻辑,手机号和天 这两个字段需要联合唯一 在表中新增 the_data 字段,字段的值是 这行记录插入时的日期(如20171219),将手机号字段 和 天数字段 联合唯一,就可以完全杜绝一天内重复提交的可能了
    请先 登录 后评论
  • Sily°苏暖年222声望 2018-09-25 09:32

    这个idea不错
    请先 登录 后评论

注册新账号

悬赏追问
10
  • 10
  • 20
  • 50
  • 100
  • 200
  • 输入数值
发布追问