记录一次数据保存出错

记录一次数据保存出错

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 协议》,转载必须注明作者和本文链接
我爱大可乐
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

费老大劲长了一个教训 :grinning:
DB::beginTransaction();中的应是数据库操作逻辑,与之无关的放在外面用程序控制,比如开头的一大坨 if 就和事务无关。

4年前 评论
我爱大可乐 (楼主) 4年前

还真是这样, 为啥会如此.
是因为 beginTransaction 每次都必须走到 commit 操作
所有的数据才能正常提交 ?

4年前 评论
我爱大可乐 (楼主) 4年前
自由与温暖是遥不可及的梦想

每开启 一个事务 id 加1 手动事务不提交 会回滚

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!