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

多動手,更優秀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM