thinkphp對180萬資料批量更新支援事務回滾
阿新 • • 發佈:2018-11-06
目前測試180萬多的資料,大概是正常的,不知道再多了會怎麼樣了
我們要給表改成 innodb型別
乾貨來了:
- set_time_limit(0);
- ini_set("memory_limit","800M");//180萬資料 資料越多越消耗記憶體
- $t1 = microtime(true);
- $Model = M('orderlisttest');//先用 M 函式例項化一個空物件
- $rr['goods_tuihuo']=1;
- $subQuery = $Model->field('orderlist_id')->table('vc_orderlisttest')->where($rr)->buildSql();//建立臨時表
- $Model->startTrans();//開啟事務
- $result=$Model->table($subQuery.'a')->field('orderlist_id')->select();
- $total=count($result);
- $num=100000;//每次執行的數量
- $fornumber =ceil($total/$num) ;//分多少次處理
- echo "事務已開啟.........<br>";
- sleep(1);
- ob_flush();
- echo 'Begin ...<br />';
- echo '正在批量更新,請耐心等待...<br />';
- echo "共有".$total."條資料<br />";
- echo "事務正在處理.........<br />";
- echo "正在執行第<span id='c'></span>組/共有".$fornumber."組</br>";
- foreach ($result as $value)
- {
- $order[]=$value['orderlist_id'];
- }
- $index=0;
- for ($i=1;$i<=$fornumber;$i++)
- {
- echo '<script>document.getElementById("c").innerHTML = "'.$i.'";</script>';
- ob_flush();
- flush();
- $arr = array();
- for($j = $index; $j < $index+$num;$j++)
- {
- $arr[] = $order[$j];
- }
- $this->updatestatus($arr,$i);
- $index += $num;
- }
- echo "執行完畢<br />";
- $t2 = microtime(true);
- echo '共耗時'.round($t2-$t1,3).'秒<br>';
- echo '共消耗記憶體: ' . memory_get_usage() . '<br />';
- }
- public function updatestatus($arr,$i)
- {
- $value='';
- foreach ($arr as $k=>$v)
- {
- if($k==0)
- {
- $value.=$v;
- }
- else
- {
- $value.=','.$v;
- }
- }
- $condition['orderlist_id'] =array('in',$value);
- $update['goods_tuihuo'] =0;
- $res = M('Orderlisttest')-> where($condition)->setField($update);
- if($res)
- {
- $map = true;
- }
- else
- {
- $map = false;
- }
- if($map==true)
- {
- M('Orderlist')->where($condition)->commit();
- echo '第'.$i.'組成功<br/>';
- }else
- {
- M('Orderlist')->where($condition)->rollback();//執行失敗回滾
- echo '第'.$i.'組失敗<br/>';
- }
- }
效果圖: