//例如,表的引擎是MyISAM ,查询速度快。
//请教下面的方法可行吗?  
        $time = time();
        $sql = "insert into a  values($did,$user,$time)";
        $ret = $this->execute($sql); //插入申请
        if($ret)
        {
            $sql = "update b set apply_num=apply_num+1 where did=".$did;
            $ret = $this->execute($sql); //申请数字+1
        }

解决方案 »

  1.   

    如果第一个sql执行成功了,第二个失败了,你准备怎么办?
      

  2.   

    MyISAM 不支持事务处理.如果你非要MyISAM 的话就祈祷1楼那家伙说的情况不会出现...
      

  3.   

    使用INNODB?   可是MYISAM速度快啊. 我这项目属于SNS,几乎用户每一步操作都要不断查询的.    头疼,求解决方案.
      

  4.   


    如果执行完第一条语句后断电了,你怎么delete掉a的数据
      

  5.   

    使用INNODB? 可是MYISAM速度快啊. 我这项目属于SNS,几乎用户每一步操作都要不断查询的.   头疼,求解决方案. 
      

  6.   

    防不胜防啊。用mysql得备台柴油发电机啊。即时供电
      

  7.   

    读写分离吧  读用MYISAM   写用INNODB
      

  8.   


    那你还得为web服务器准备台柴油发电机。。
    哇塞,一不小心落后了
    sns网站如果流量大的话,负载均衡和缓存是必不可少的。
      

  9.   


    那么他会将前面执行的所有sql全部再弄回去,前提是先将前面的数据备份下
      

  10.   

    世事无绝对~~1.用不用事务,取决于中断的操作对你的数据和业务的影响程度,如果无所谓或者有其它修补办法(比用事务的代价小)的话,当然可以不用事务比如你的例子
            $sql = "insert into a  values($did,$user,$time)";
            $sql = "update b set apply_num=apply_num+1 where did=".$did;
    如果这两个一直是配对执行的话, 是否可以理解成 
    a中$did的总行数==b中$did对应的apply_num ?
    也就是第二句能否改为
    update b set apply_num=(select count(*) from a where did={$did} ) where did={$did}
    这样就算一次操作中断,下一次也能立刻得到纠正,甚至于,你这个b中的apply_num完全可以在需要时通过a表计算出来? 当然这个b表相当于缓存,要不要取决于你对速度的要求.2.现在innodb是否比myisam慢,也不是那么绝对,以前比它慢那是一定的,而现在innodb已经是mysql的缺省引擎,可以看出mysql也推荐innodb了.这些最好通过你自己系统的测试来确定.3.用事务一般肯定比不用事务慢,就算是innodb也是这样,但是一个问题会有很多方法解决,这里速度慢了,也可以在其它地方通过其它手段来提高.
      

  11.   

    不使用事务也行。你可以用mysqli的autocommit方法,不过引擎还得用innodb,myisam是不行滴
      

  12.   

     楼主的这个代码不行吗?
             $time = time();
            $sql = "insert into a  values($did,$user,$time)";
            $ret = $this->execute($sql); //插入申请
            if($ret)
            {
                $sql = "update b set apply_num=apply_num+1 where did=".$did;
                $ret = $this->execute($sql); //申请数字+1
            }如果插入申请失败,那么$ret就是FALSE,也就不会执行UPDATE申请数字+1的操作了。楼主没试试?
      

  13.   


    //例如,表的引擎是MyISAM ,查询速度快。
    //请教下面的方法可行吗?  
            $time = time();
            $sql = "insert into a  values($did,$user,$time)";
            $ret = $this->execute($sql); //插入申请
            if($ret)
            {
                $sql = "update b set apply_num=apply_num+1 where did=".$did;
                $ret2 = $this->execute($sql); //申请数字+1
                if(! $ret2) {
                  $this->execute("delete ....");
                }
            }
      

  14.   

    在MyISAM数据表上 你可以用LOCK TABLE 来迂回实现,不过显然带来的负作用也是显而易见。
      

  15.   

    SNS应该有比较多数据不那么重要,可以不考虑完整性吧
      

  16.   

    SNS丢一条数组也没什么关系。那个丢数组的概率都可以去买彩票中奖了.又不是银行
      

  17.   

    建议楼主还是改用 InnoDB 吧,即使不为了“事务”。“MyISAM 查询速度快”是有前提的。当写操作不是特别稀疏的时候,MyISAM 的表锁会很大影响查询速度,它的负面影响,没亲自遇到的时候是很难想像的。
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  18.   

    这个要 innodb 吧?在 innodb 的基础上套上事务语句行不?如:$db=mysql_connect($DBHOST,$DBUSER,$DBPWD); //连接数据库服务器
    mysql_select_db($DBNAME,$db); //选择数据库
    .........
    .........
    mysql_query("START TRANSACTION",$db); //开始事务       $time = time();
            $sql = "insert into a  values($did,$user,$time)";
            $ret = $this->execute($sql); //插入申请        $sql = "update b set apply_num=apply_num+1 where did=".$did;
            $ret2 = $this->execute($sql); //申请数字+1if($ret && $ret2)
     {
      mysql_query("COMMIT",$db); //如果上面两条 sql 语句都执行成功,则用 commit 进行提交
      echo "插入成功!";
      }
    else
     {
      mysql_query("ROLLBACK",$db); //如果至少有一条没执行成功,则用 rollback 回滚,使数据库恢复到原状
      echo "插入失败!";
      }
      

  19.   

    inno表不一定比其他表慢。 理论让,inno表的是行锁,支持高并发。
    inno表的缺点是count统计。除非你精确统计, 一般这个也可以通过explain来得。有程序就这么做。 你也可把count计入别的表。具体的可找dba分析,但你用事和inno表是较佳选择.