当前位置 : 主页 > 网络编程 > PHP >

laravel中try...catch实现多件事务处理

来源:互联网 收集:自由互联 发布时间:2021-06-28
①②③三件事务要同时完成,不报错,结果都不为空,才会走到commit()提交事务。否则,调到catch进行回滚,并返回失败信息 /** * 修改订单付款状态 */ public function changeOrderStatus($request
①②③三件事务要同时完成,不报错,结果都不为空,才会走到commit()提交事务。否则,调到catch进行回滚,并返回失败信息
/**
     * 修改订单付款状态
     */
    public function changeOrderStatus($request){

        $id = $request['id'];     //获取订单id
        $where['id'] = $id;
        $rechargeinfo = $this->getOne($where);    //根据id获取该条订单详细信息

        if($rechargeinfo['actual_arrival']!=0){   //如果表中字段不为0,则说明已经到账,无法再次确认

            $ajaxData['status'] = 0;
            $ajaxData['msg'] = '已确认过,无法重复提交';
            return $ajaxData;

        }


        $data['updated_at'] = date('Y-m-d H:i:s');

        //开启事务处理
        $this->start();

        try{

        //①更新付款状态

            switch($rechargeinfo['type']){
                case 1:
                $coin_type = 'eth';      //教育币
                break;
                case 2:
                $coin_type = 'btc';      //比特币
                break;
                default:
                $coin_type = 'none';

            }

        $settingmodel = new Setting();  //实例化设置表模型,用于通过币种获取比例
        $res3 = $settingmodel->getOne(array('name'=>$coin_type));
        $bili = $res3['value'];         //得到该币种的比例


        $amount = $rechargeinfo['amount'];    //提交货币数量
        $data['actual_arrival'] = $amount;     //实际到账数量
        $data['state'] = '到账成功!';
        $res = $this->up($where, $data);    //更新recharge表数据


        //②member表edu入库
        $membermodel = new Member();
        $where2['id'] = 2;
         if($coin_type=='eth'){
             $edu_amount = $amount;     //如果是教育币直接入库
         }else{
             $edu_amount = $amount*$bili;   //如果是比特币就转成教育币
         }

        $membermodel->up($where2, array('edu_amount'=>$edu_amount));   //导入用户个人账户

        //③充值日志
        $logmodel = new Log();   //实例化log模型用于调用addlog函数
        $logmodel->addLog($rechargeinfo,1);  //1 充值  2 提现
            
        $this->commit();

        }catch (\Exception $e){
            $this->rollBack();
            //echo $e->getMessage();die();
            $ajaxData['status'] = 0;
            $ajaxData['msg'] = '确认到账失败!';
            return $ajaxData;
        }


        $ajaxData['status'] = 1;
        $ajaxData['msg'] = '确认到账成功!';
        return $ajaxData;

    }



     public function start()
    {
        DB::beginTransaction();
    }

    public function commit()
    {
        DB::commit();
    }

    public function rollBack()
    {
        DB::rollBack();
    }
网友评论