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

目前测试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/>';
        }
    }
复制代码

 

  效果图:

  

posted @   小H先生  阅读(1169)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示