事務的機制通常被概括為“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 看看什么原因
多動手,更優秀。