thinkphp5商城系統功能初步解決避免短時間內大量下單出錯問題,@勤勤學長

邏輯順序

下單

判斷用戶是否足夠錢支付訂單

如果夠錢的話,同時進行三個數據操作(更新用戶餘額、生成訂單信息、生成資金明細記錄)

問題1:三個數據操作有一個出錯,就要撤銷三個記錄信息。

解決方法:使用事務操作,事務回滾。

https://www.kancloud.cn/manual/thinkphp5/139063

問題2:更新餘額的時候如何使用數據庫最新的餘額信息。

例如,有一個用戶,一秒了幾十個訂單,也可能不是惡意下單。有可能出現當前餘額還沒來得及更新就又繼續操作了,出現訂單實際總金額超出用戶可用餘額的情況。

解決方法:試用setDec,查詢條件加個條件,當前用戶餘額要大於或等於訂單金額,才更新。

$orderMoney 是訂單金額

$openId 用戶id

https://www.kancloud.cn/manual/thinkphp5/135178

$res = Db::table('xz_user')->where(['openId'=>$openId,'money'=>['>=',$orderMoney]])->setDec('money',$orderMoney);

 

完整代碼

//啓動事務
        Db::startTrans();
        try{
        
            $res = Db::table('xz_user')->where(['openId'=>$openId,'money'=>['>=',$orderMoney]])->setDec('money',$orderMoney);
            if(!$res){
                Db::rollback();// 回滾事務
                $arr['code']=111;
                $arr['msg']='餘額不足!本訂單需支付'.$orderMoney.',當前餘額.'.$userMoney;
                return json($arr);
            }else{
                //添加資金明細記錄
                Db::table('xz_money_log')->insert($addSql);
                //添加訂單
                Db::table('xz_order')->insert($addOredrSql);
            }
            
            Db::commit();//提交事務
            $arr['code']=101;
            $arr['msg']='訂單提交成功';
            return json($arr);
        } catch (\Exception $e) {
            // 回滾事務
            Db::rollback();
            $arr['code']=109;
            $arr['msg']='訂單支付失敗!請重新嘗試操作';
            return json($arr);
        }

問題3:短時間內大量下單,排序顯示不正常,比如說我一秒鐘下了8個訂單,時間線就不匹配了。

解決方法:mysql不能用低於5.6版本的,不然不能設置時間長度。默認'CURRENT_TIMESTAMP(3)',這樣就能儲存到毫秒級別的數據信息了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章