①②③三件事务要同时完成,不报错,结果都不为空,才会走到commit()提交事务。否则,调到catch进行回滚,并返回失败信息 /** * 修改订单付款状态 */ public function changeOrderStatus($request
/** * 修改订单付款状态 */ 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(); }