在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/PHP  數據庫/ laravel下新增數據,偶爾會有重復數據

laravel下新增數據,偶爾會有重復數據

1.公司要實現一個業(yè)務邏輯:一天一個手機號碼phone只能提交一次訂單。
目前這個業(yè)務邏輯不涉及高并發(fā)等場景,大概也就是幾分鐘一次訂單;

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.為了模擬類似的情況發(fā)生,用linux做了定時任務,建了一個臨時表用相同的代碼每分鐘訪問一次接口。發(fā)現并不會出現重復的數據

回答
編輯回答
忘了我
一天一個手機號碼phone只能提交一次訂單

可以從數據庫的設計方面進行調整

根據業(yè)務邏輯,手機號和天 這兩個字段需要聯合唯一

在表中新增 the_data 字段,字段的值是 這行記錄插入時的日期(如20171219),將手機號字段 和 天數字段 聯合唯一,就可以完全杜絕一天內重復提交的可能了

2018年3月28日 04:29
編輯回答
溫衫

可以在表單驗證里完成,代碼:

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' => '今天已申請過訂單,請等待處理!'
    ];
}

文檔

2017年8月22日 15:16
編輯回答
練命

這個idea不錯

2018年2月8日 01:46