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 看看什么原因

多动手,更优秀。
posted @ 2017-12-27 18:43  曹士达  阅读(4760)  评论(0编辑  收藏  举报