tp3.2 事务处理
事务的机制通常被概括为“ACID”原则即原子性(A)、稳定性(C)、隔离性(I)和持久性(D)。
原子性:构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行。
稳定性:数据库在事务执行前后状态都必须是稳定的。
隔离性:事务之间不会相互影响。
持久性:事务执行成功后必须全部写入磁盘
场景:需要对多个表同时进行修改操作,用到了事物
先看代码(controller)
/** * 返利记录 */ public function payBack(){ if($_GET['ins']){ $id = I('id'); //ID $uuid = I('uuid'); //UUID switch ($_GET['ins']) { case 'tongguo': if(!empty($id)&&!empty($uuid)){ $result = D('Red')->redPack($id,$uuid,1); //重点在这里 往⬇️看 if($result){ $this->success('已通过',__ROOT__); }else{ $this->error('通过失败',__ROOT__); } } exit; break; case 'quxiao': if(!empty($id)&&!empty($uuid)){ $result = D('Red')->redPack($id,$uuid,-1); if($result){ $this->success('取消通过',__ROOT__); }else{ $this->error('取消通过失败',__ROOT__); } } exit; break; } } }
(Model)
/** * 【红包返利】 * @param string $id * @param string $uuid * @param string $ispass 1:通过 -1:不通过 * @return bool */ public function redPack($id='',$uuid='',$ispass=''){ if(!empty($id)&&!empty($uuid)){ $data['isCheck'] = $ispass; M()->startTrans(); $result = $this->where('id='.$id)->save($data); $resultBalance = $resultCheck = true; //余额 返利状态 if(!empty($result)){ //通过 修改余额 if($ispass==1){ $list = M('redpack as ra ') ->join(' LEFT JOIN t_account as ga on ra.uuid=ga.uuid') ->where(" ra.id=$id and ra.uuid=$uuid ") ->field('ra.redpackmoney,ra.uuid,ga.accountBalance') ->find(); if($list['redpackmoney']==0){ return true; }else{ $balanceData['accountBalance'] = $list['accountbalance']+$list['redpackmoney']; //修改用户余额 } $resultBalance = M('Account')->where("uuid=".$list['uuid'])->save($balanceData); //用户表 Account $checkData['isReceive'] = $ispass; //修改是否领取 $checkData['receiveTime'] = strtotime(date("Y-m-d h:i:s")); //修改领取时间 $resultCheck = $this->where("id=$id and uuid=$uuid" )->save($checkData); //返利表 redPack }else if($ispass==-1){ $resultCheck = true; } } if(!empty($result) && !empty($resultBalance) && !empty($resultCheck) ){ M()->commit(); return true; }else{ M()->rollback(); return false; } } }
形式:
M()->startTrans();
执行操作1 增删改查
判断1
成功:执行2,3...... 增删改查
判断1,2,3
同时成功(true)
M()->commit();
否则
M()->rollback();
返回最终结果
可以自己打印 结果1,2,3 看看什么原因
多动手,更优秀。