邏輯順序
下單
判斷用戶是否足夠錢支付訂單
如果夠錢的話,同時進行三個數據操作(更新用戶餘額、生成訂單信息、生成資金明細記錄)
問題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)',這樣就能儲存到毫秒級別的數據信息了。