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

时间: 2024-10-14 11:32:08

thinkphp对180万数据批量更新支持事务回滚的相关文章

SqlServer批量刷数据执行事务回滚语句备份

企业进行对数据库执行刷数据工作,一段很长的语句希望同时成功或者失败时用到. 1.建立测试环境 /************************************************************ * Code formatted by SoftTree SQL Assistant ?v6.5.278 * Time: 2016/9/29 21:33:55 ************************************************************/

mybatis数据批量更新

原sql语句: update zyjd set peopleId=case when id=1 then   10, when id=2 then   11 end, roadgridid =case when id=1 then   101, when id=2 then   102 end, ---- where id=1 or id=2 sql意思:当id=1的情况下peopleId =10,roadgridid =101,当id=2的情况下peopleId =11,roadgridid 

thinkphp 的事务回滚处理 和 原始PHP的事务回滚实例

1.  要程序里面支持事务,首先连接的数据库和数据表必须支持事务 mysql   为例: 数据库InnoDB支持 transactions 数据表支持事务:InnoDB  支持transaction 2. 框架thinkphp  支持事务代码 public function testrollback(){ $model1 = D('item'); $model2 = D('vote'); $model1->startTrans(); $res1 = $model1->where('id = 5

ThinkPHP实现事务回滚示例代码

ThinkPHP的事务回滚示例如下: $m=D('YourModel');//或者是M(); $m2=D('YouModel2'); $m->startTrans();//在第一个模型里启用就可以了,或者第二个也行 $result=$m->where('删除条件')->delete(); $result2=m2->where('删除条件')->delete(); if($result && $result2){ $m->commit();//成功则提交

thinkphp curd的事务回滚 一看就会

/** *thinkphp数据库的事务回滚例子 *这一般用在多表操作,比如: (1)订单表和其他订单关联信息,删除订单同时也要把订单关联表中的信息删掉,如果说删除了订单表结果在删除订单关联信息表时出现问题,也就是说,订单的关联信息没有删掉,这时就会出现信息不对应,甚至信息的冗余,这时采用事务回滚,如果一个没有删掉,之前的也要回滚,保持记录的对应统一 (2)银行打钱,如果A给B打钱,给Binsert成功了,但是Adelete失败,这时银行就亏大了,明白?此时就要回滚,如果两者其中一者不成立,则都复

C# List数据批量更新

针对单条数据一般都是update语句直接更新 例如:update UserTable set UserName='小名'   where userid=xxx 但是如果是针对List数据组进行更新的话不外乎两种 1.程序for.foreach.while循环语句然后多次请求数据库更新(这种在这里不多做解释,因为基本上都知道这种方法) 2.重点说下下面这种方式:通过XML的方式在数据库进行批量的更新 1.建立ListToXML方法 /// <summary> /// 使用反射把List<T

Sql Server数据批量更新

UPDATE S SET S.[name]=T.[name],S.[sch_id]=T.[sch_id],S.[sex]=T.[sex],S.[isOk]=T.[isOk] FROM [Student] S INNER JOIN ( SELECT '1010' AS id,'小妹1130946325' AS name,'2' AS sch_id,'gril' AS sex,0 AS isOk UNION ALL SELECT '1011' AS id,'小子1130946325' AS name

kubernetes 滚动更新发布及回滚

基本命令 记录历史 --record kubectl  apply -f **** --record 查看当前状态 kubectl rollout status deployment/demo -w 查看历史 kubectl rollout history deployment/demo 回滚到指定版本 kubectl rollout undo deployment/demo --to-revision=2 原文地址:https://www.cnblogs.com/zhangeamon/p/82

Neo4j 第五篇:批量更新数据

相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据.当数据量非常大时,这种做法非常耗时,大多数时间耗费在连接数据库和打开事务上,高效的做法是利用Neo4j提供的参数(Parameter)机制和UNWIND子句:在一次数据更新中,进行一次连接,打开一次事务,批量更新数据:参数用于提供列表格式的数据,UNWIND子句是把列表数据展开成一行一行的数据,每行数据都会执行结构相同的Cypher