記錄一次資料儲存出錯
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 協議》,轉載必須註明作者和本文連結