thinkphp对180万数据批量更新支持事务回滚

目前测试180万多的数据,大概是正常的,不知道再多了会怎么样了
我们要给表改成 innodb类型

干货来了:

  1.        set_time_limit(0);
  2.         ini_set("memory_limit","800M");//180万数据  数据越多越消耗内存
  3.         $t1 = microtime(true);
  4.         $Model = M('orderlisttest');//先用 M 函数实例化一个空对象
  5.         $rr['goods_tuihuo']=1;
  6.         $subQuery = $Model->field('orderlist_id')->table('vc_orderlisttest')->where($rr)->buildSql();//建立临时表
  7.         $Model->startTrans();//开启事务
  8.         $result=$Model->table($subQuery.'a')->field('orderlist_id')->select();
  9.         $total=count($result);
  10.         $num=100000;//每次执行的数量
  11.         $fornumber =ceil($total/$num) ;//分多少次处理
  12.         echo "事务已开启.........<br>";
  13.         sleep(1);
  14.         ob_flush();
  15.         echo 'Begin ...<br />';
  16.         echo '正在批量更新,请耐心等待...<br />';
  17.         echo "共有".$total."条数据<br />";
  18.         echo "事务正在处理.........<br />";
  19.         echo "正在执行第<span id='c'></span>组/共有".$fornumber."组</br>";
  20.         foreach ($result as $value)
  21.         {
  22.             $order[]=$value['orderlist_id'];
  23.         }
  24.         $index=0;
  25.         for ($i=1;$i<=$fornumber;$i++)
  26.         {
  27.             echo '<script>document.getElementById("c").innerHTML = "'.$i.'";</script>';
  28.             ob_flush();
  29.             flush();
  30.             $arr = array();
  31.             for($j = $index; $j < $index+$num;$j++)
  32.             {
  33.                 $arr[] = $order[$j];
  34.             }
  35.             $this->updatestatus($arr,$i);
  36.             $index += $num;
  37.         }
  38.         echo "执行完毕<br />";
  39.         $t2 = microtime(true);
  40.         echo '共耗时'.round($t2-$t1,3).'秒<br>';
  41.         echo '共消耗内存: ' . memory_get_usage() . '<br />';
  42.     }
  43.     public function updatestatus($arr,$i)
  44.     {
  45.         $value='';
  46.         foreach ($arr as $k=>$v)
  47.         {
  48.             if($k==0)
  49.             {
  50.                 $value.=$v;
  51.             }
  52.             else
  53.             {
  54.                 $value.=','.$v;
  55.             }
  56.         }
  57.         $condition['orderlist_id'] =array('in',$value);
  58.         $update['goods_tuihuo'] =0;
  59.         $res = M('Orderlisttest')-> where($condition)->setField($update);
  60.         if($res)
  61.         {
  62.             $map = true;
  63.         }
  64.         else
  65.         {
  66.             $map = false;
  67.         }
  68.         if($map==true)
  69.         {
  70.             M('Orderlist')->where($condition)->commit();
  71.             echo '第'.$i.'组成功<br/>';
  72.         }else
  73.         {
  74.             M('Orderlist')->where($condition)->rollback();//执行失败回滚
  75.             echo '第'.$i.'组失败<br/>';
  76.         }
  77.     }

  效果图:

  

 

转载于:https://www.cnblogs.com/swmin/p/9914879.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值