zoukankan      html  css  js  c++  java
  • 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')->delete();
    $res2 = $model2->where('id = 2')->delete();
    dump($res1);
    dump($res2);
    if($res1 && $res2){
    $model1->commit();   //只有$res1 和  $res2  都执行成功是才真正执行上面的数据库操作
    dump("commit");
    }else{
    $model1->rollback();  //  条件不满足,回滚
    dump("rollback");
    }
    dump("over");
    exit;
    }

    3.  原始PHP 代码事务实例

    方法一:只支持数据库和数据表都是 innoDB  的情况

    public function  rollbackoriginal1(){
            $conn = mysql_connect('127.0.0.1','summerzi','summerzi') or die('DB connection failed!');
            mysql_select_db('summer',$conn);
            mysql_query('set names "GBK"');
            mysql_query('BEGIN');
            $sql1 = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(41,1,233);";
            $sql2 = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(fdfd,2,235);";
            $res1 = mysql_query($sql1);
            $res2  = mysql_query($sql2);
            dump($sql1);
            dump($sql2);
            dump($res1);
            dump($res2);
            if($res1 && $res2){
                mysql_query('COMMIT');
                dump('commit success!');
            }else{
                mysql_query('ROLLBACK');
                dump('commit failed, rollback!');
            }
            mysql_query('END');
    
        }

    方法二:(注意:对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法)

    public function rollbackoriginal2(){
            $conn = mysql_connect('127.0.0.1','summerzi','summerzi') or die('DB connection failed!');
            mysql_select_db('summer',$conn);
            mysql_query('set names "GBK"');
            mysql_query('SET AUTOCOMMIT=0');////设置mysql不自动提交,需自行用commit语句提交
            $sql1 = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(41,1,233);";
            $sql2 = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(44,2,235);";
            //mysql_query("LOCK TABLES `hmbl_userdata` WRITE");//锁定表
            $res1 = mysql_query($sql1);
            $res2  = mysql_query($sql2);
            dump($sql1);
            dump($sql2);
            dump($res1);
            dump($res2);
            //mysql_query("UNLOCK TABLES");//解除锁定
            if($res1 && $res2){
                mysql_query('COMMIT');
                dump('commit success!');
            }else{
                mysql_query('ROLLBACK');
                dump('commit failed, rollback!');
            }
            mysql_query("SET AUTOCOMMIT=1");
            mysql_query('END');
            
    
        }

    php + mysql  对事务的处理比较简单,涉及到业务中多个数据操作,就可以考虑用事务处理

  • 相关阅读:
    SVN与TortoiseSVN实战:标签与分支
    IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
    IOS性能调优系列:使用Allocation动态分析内存使用情况
    IOS性能调优系列:使用Instruments动态分析内存泄漏
    IOS性能调优系列:Analyze静态分析
    2014年个人知乎收藏夹整理
    IOS开发环境更换后重新制作Provisioning Profile证书详解
    使用VS2010编译MongoDB C++驱动详解
    ACE服务端编程1:使用VS2010编译ACE6.0及从ACE5.6升级的注意事项
    std::string在多字节字符集环境下substr的实现方法
  • 原文地址:https://www.cnblogs.com/summerzi/p/4393790.html
Copyright © 2011-2022 走看看