thinkphp---用事務處理批量操作
阿新 • • 發佈:2018-12-21
我們在進行一些業務邏輯的時候,難免會出現批量操作的問題,特別是批量修改操作,如果資料量大,總會考慮到批量修改到一半怎麼辦?所以如果使用事務來進行批量操作就會好很多,直接看程式碼:
public function edit(){ if(!IS_POST)die; $data = I('post.'); $columDB = D('Column'); $id = I('post.id','','intval'); $mid = I('post.mid','','intval'); $name = strtolower(I('post.name','','trim')); $pid = I('post.pid','','intval'); //$savepid = $columDB->where(array('id'=>$id))->getField('pid'); // $model_name = M('admin_model')->where(array('id'=>$mid))->getField('table_name'); $data['url'] = $name.'/'; $data['updatetime'] = time(); // if(!$pid){ // $data['url'] = strtolower($model_name).'/index.html'; // }; // 頂級欄目用的是 index 方法 $return = array(); $return['code'] = 1; $return['msg'] = '修改成功'; // 修改欄目的時候 如果修改過欄目的標識 需要修改當前欄目下的所有文章的連結 $cateInfo = $columDB->find($id); $error=[]; // 記錄失敗ID if($name != $cateInfo['name']){ $document = M('document'); $list = $document->where(array('cid'=>$id))->select(); // 開啟事務 $document->startTrans(); foreach($list as $k=>$v){ // setField('value', $val); $isRight = $document->where(array('id'=>$v['id']))->setField('url',$name.'/'.$v['id'].'.html'); if(!$isRight){ $error[] = $isRight; }; }; if(count($error)){ $document->rollback(); $return['code'] = 0; $return['msg'] = '修改欄目文章連結失敗'; exit(json_encode($return)); }; $document->commit(); }; if(!$columDB->create($data)){ $return['code'] = 0; $return['msg'] = $columDB->getError(); exit(json_encode($return)); }; // 開啟事務 $columDB->startTrans(); $resID = $columDB->save(); if(!$resID && $resID != 0){ // 回滾 $columDB->rollback(); $return['code'] = 0; $return['msg'] = '修改失敗'; }; $columDB->commit(); // if(!$resID && $resID != 0){ // $return['code'] = 0; // $return['msg'] = '修改失敗'; // }; $return['id'] = $resID; exit(json_encode($return)); }