function credits($new_path)
{  
   $objDB = dblink();    
   $sql = 'UPDATE u_credit SET num=num+1 WHERE userid IN('.$new_path.')';
   $ret=$objDB->execute($sql);      // 又一查询
   $objDB->execute("SELECT num FROM u_credit ");
      $rs_userid = $objDB->fetch_array();
      echo $rs_userid['num'];
}
上面是我要调用的函数,函数中有二个sql语句,有时数据很多时,
不同步,为了让数据同步,我想让二个sql做成一个事务,大家帮我想想,
怎么加事务的代码呀,帮忙贴点代码。。thanks

解决方案 »

  1.   

    主要看桌面引擎,默认的MyISAM不支持事务处理。
    lz只能通过update条件判断是否是需要更新的数据。
    想支持事务处理,需要用InnoDB引擎,
    结合select update语句进行update处理就可以了。
      

  2.   

    function credits($new_path) 
    {   
       $objDB = dblink();    
         $objDB->execute("SET AUTOCOMMIT=0");
         $objDB->execute("Begin");
       $sql = 'UPDATE u_credit SET num=num+1 WHERE userid IN('.$new_path.')'; 
       $ret=$objDB->execute($sql); 
         if(!isset($ret))
         {
    //fail, neeed to delete the record added just now.
    $objDB->execute("Rollback");
    echo "serious error";
    die;
          }

          // 又一查询 
       $objDB->execute("SELECT num FROM u_credit "); 
         $rs_userid = $objDB->fetch_array(); 
         echo $rs_userid['num']; 
         $objDB->execute("commit");

    我加了上面颜色代码,可感觉好像没有用,因我随便注释 其中后来加的代码,结果都是一样运行。
      

  3.   

    想支持事务处理,需要用InnoDB引擎, 
    结合select update语句进行update处理就可以了。
    例如這樣的表結構:
    CREATE TABLE `countries` (
      `id` int(6) NOT NULL auto_increment,
      `value` varchar(250) NOT NULL default '',
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
      

  4.   

    我的表是 InnoDB 呀,
    是不是写   
      $objDB->execute("SET AUTOCOMMIT=0"); 
        $objDB->execute("Begin"); 
    等语句时还需配制什么呀,或是这样写本就没用呀,
      

  5.   


    你可以在数据库上测试一下,
    执行SET AUTOCOMMIT = 0
    再update 、 rollback、update、commit测试一下事务处理是否好用。PHP方面,如果是mysqli、pear或者ZendFramework_DB的话,执行autocommit相应的接口就可以。
      

  6.   

    <?php
     /*
       1 dblink(); 使用mysqli 建立连接 例:function dblink(){ return mysqli("localhost","root","password","database") }
       2 创建的表使用 innoDB,或BDB 引擎
     */
     $objDB = dblink(); 
     $objDB->autocommit(false); //关闭自动提交,使用事务提交 $sql="update table set f1='xx'";
     $r1=$objDB->query($sql); $sql="update table set f2='yy'";
     $r2=$objDB->query($sql); if($r1 && $r2){
       $objDB->commit(); //提交事务
     }else{
      $objDB->rollback(); //回滚事务
     }
     $objDB->autocommit(true); //开启自动提交
     $objDB->close(); //关闭数据库
    ?> email:[email protected] 希望各朋友交流技术!
      

  7.   


    function credits($new_path) 
    {   
       $objDB = dblink(); 
         $sql_set_innodb="alter table u_credit type=innodb"; 
         $sql_set_myisam="alter table u_credit type=myisam"; 
       $sql = 'UPDATE u_credit SET num=num+1 WHERE userid IN('.$new_path.')'; 
         $objDB->execute($sql_set_innodb); 
         $objDB->execute("start transaction"); 
       $ret=$objDB->execute($sql);       // 又一查询 
       $result=$objDB->execute("SELECT num FROM u_credit "); 
         if($ret && $result)
         $objDB->execute("commit"); 
         else
         $objDB->execute("rollback"); 
         $objDB->execute($sql_set_myisam); 
          $rs_userid = $objDB->fetch_array(); 
          echo $rs_userid['num'];