記錄一次資料儲存出錯

我愛大可樂發表於2020-11-02

記錄一次資料儲存出錯

1、問題描述

我在foreach中加入了事務,但是執行完之後,在資料庫中沒有相應的資料,但是看日誌顯示整個流程執行完成。

2、程式碼示例
$data=Order::where('is_deleted',0)->where('pay_status',0)->select('money')->get();
foreach($data as $k=>$v){
    DB::beginTransaction();
    try {
        $user=User::find($v->user_id);
        if($user->money<=0){
            continue;
        }
        if($v->money<=$user->money){
            $pay_money=$v->money;
            $no_pay_money=0;
            $pay_status=2;
            $money=$user->money-$v->money;
        }else{
            $pay_money=$user->money;
            $no_pay_money=$v->money-$user->money;
            $pay_status=1;
            $money=0;
        }
        $user->money=$money;
        $order=Order::find($v->id);
        $order->pay_status=$pay_status;
        $order->pay_money=$pay_money;
        $order->no_pay_money=$no_pay_money;
        if(!$order->save()){
            throw new \Exception('1');
        }
        $paylog=new PayLog();
        $paylog->xxx=xxx;
        if(!$paylog->save()){
            throw new \Exception('1');
        }
        DB::commit();
    }catch (Exception $e) {
        Log::error('執行出錯:'.$e);
        DB::rollback();
    }
}
3、查詢問題
  • 在commit前後加入日誌,檢視執行日誌,發現有相關日誌,則說明程式順序執行完畢。
  • 在表中手動插入一條資料,發現ID不連續,則說明資料已經生成成功。
  • 生成資料但是沒有儲存則說明事務沒有提交,將continue前加入commit,發現資料儲存成功。

結語:

基礎不紮實,程式碼質量不夠,小問題都找許久。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
我愛大可樂

相關文章