php中用mysql的START TRANSACTION和commit包围了4条插入语句,发现用事务比不用的时候插入的快这是为什么呢?

解决方案 »

  1.   

    <?php 
    header("Content-type: text/html; charset=utf-8");
    require 'inc/config.php';
    $db->table('type');
    $type=$db->where('pid>0')->select();//后改
    function r($array)
    {
    return $array[rand(0,count($array)-1)];
    }function rstr($str)
    { $c=strlen($str)/3-3; 
    return mb_substr($str, rand(0,$c),1,'utf8');
    }$array1=array('哈尔滨','齐齐哈尔','牡丹江','佳木斯','大庆'.'黑河','七台河','鹤岗','双鸭山');
    $array2=array('三国','水浒','西游','江南','店里','电力','职工','中山','大山','黑山','大老虎','齐达内','科比','乔丹','奥尼尔');
    // $array3=array('外语','英语','小语种','计算机','职业技能','职业资格','考研','文体艺术','远程教育','学历教育','少儿培训','研修管理','外教口语','考研口语','新概念','雅思','托福','四六级','公共口语','口语笔译','韩语','法语','等级考试','软件开发','速录师','美容美发','理财规划','文秘类','公务员','政治','口才培训','拉丁舞','职业资格','财会类','中专技术','成人高考','少儿口才','夏令营','拓展培训','企业内训','其他');
    $array4=array('培训中心','学校','机构','大学','小学','中学','培训学校');
    $array5=array('一级考试','七级考试','六级考试','五级考试','四级考试','三级考试','二级考试');
    $array6=array('成人','幼儿','少年','青年','老年','青少年');
    $array7=array('大班','中班','小班');
    $array8=array('香坊','道理','道外','南岗','平方','动力','太平','江北');
    $array9=array('东大直街','西大直街','学府路','南通大街','和兴路','通达街','安发桥','海城桥','中山路','红军街','果戈里大街','大成街',
    '宽城街','宣化街','黄河路','长江路','经纬街','中央大街','新阳路','哈药路','抚顺街','顾乡大街','霁虹桥','田地街','买卖街','友谊路
    ','靖宇街','景阳街','北环路','承德广场','南直路','太平桥','红旗大街','公滨路','珠江路','和平路','三大动力路');$name1='赵钱孙李周吴郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦';
    $name2='大小一二三四五六七八九十';
    $name3='山风天地江河湖海洋雷电';
    // $db->table('article');
    // $begin=$db->order('id desc')->limit(1)->find('article.id');
    // $begin=$begin[id];//----------------------------------开始造假信息------------------O(∩_∩)O~------------------------------ $db->startTrans();

    $school=r($array1).'市'.r($array2).$type[rand(0,count($type)-1)][name].r($array4);
    $db->table('article');
    $aid=$db->add(array(title=>$school,author=>1,audit=>rand(0,1),content=>'学校描述测试信息'.rand(1,100000)));

    $db->table('school');
    $sid=$db->add(array(name=>$school,articleid=>$aid,recommend=>rand(0,1)));


    for($j=0;$j<10;$j++)
    {
    $address=r($array1).'市'.r($array8).'区'.r($array9).rand(1,300).'号'.rand(100,2000).'室';//course表和class公用

    $special='特色'.r($array1).'特色'.r($array7).'特色'.r($array1).'特色'.r($array5).'特色'.r($array2).'特色'.r($array3).'特色'.r($array4);
    $course=$type[rand(0,count($type)-1)][name].r($array5).'培训课程';
    $teacher=rstr($name1).rstr($name2).rstr($name3);
    $db->table('course');
    $cid=$db->add(array(special=>$special,address=>$address,name=>$course,teacher=>$teacher,schoolid=>$sid,typeid=>$type[rand(0,count($type)-1)][id],introduce=>'课程介绍321'.r($array6).r($array7).r($array1).r($array2).r($array4)));

    for($k=0;$k<10;$k++)
    {
    $class=r($array6).r($array7);

    $db->table('class');
    $begintime='2013-'.rand(1,12).'-'.rand(1,28);
    $price=rand(1000,30000);
    $db->add(array(name=>$class,begintime=>$begintime,courseid=>$cid,type=>1,address=>$address,price=>$price,favourable=>rand(6,10)*$price/10));
    }
    }

    if($db->commit())
    {
    echo "<div style=\"background-color:#999;height:60px;color:#FFF; line-height:60px; text-align:center\">
    功添加学校:$school(ID编号为:$sid)</div>";
    $db->jump("test_data_create.php");
    }?>
      

  2.   

    这是相对的,而不是绝对的。通常说索引可以加快查询速度,但只有在数据量达到一定规模的情况下是这样的。个人认为简单操作,使用事务的效果不是非常明显。只有在 批量 操作时效果才是明显的。比如一次添加100条记录,使用事务效果会比较明显。可以这样理解:到银行存钱,10个存折,到一个柜台办理,显然是优于分别到10个柜台办理。省去了排队等候过程。可省去了调取你账户信息的过程。
    你想一下好了,一件事请10个步骤,如果使用事务,必须监测每一个步骤的执行,任何一步失败都必须rollback。不使用事务就是不用保证10个步骤全部完成,我执行第一个步骤之后,第二部失败就完事了,因为无关紧要。以淘宝为例,你浏览商品的时候根本不用事务,但是当你付钱的时候就用事务了。事务是保证一件事情要么全部完成,要么什么都不做。