Mysql::construct();
                        Mysql::$mydqldb->beginTransaction();//开启事务
                try{
                     $sql13="UPDATE verydows_goods SET cate_ids =333 WHERE goods_id in (4,5,6)";
                     $res=Mysql::$mydqldb->exec($sql13);
                     $sql="insert into verydows_goods (goods_brief,goods_content) VALUES (111,222)";
                     $res=Mysql::$mydqldb->exec($sql);
                      Mysql::$mydqldb->commit();//事务提交
                }catch (Exception $e){
                    echo "<pre>";print_r($e->getMessage());echo "<pre>";
                    Mysql::$mydqldb->rollback();//事务回滚
                }
事务不能回滚  怎么回事 大神看看

解决方案 »

  1.   

    虽然 $sql 有误
    但是 $res=Mysql::$mydqldb->exec($sql); 是否会触发异常,是由你的 Mysql 类决定的
      

  2.   

    你的表引擎是InnoDB吗?
      

  3.   

      我的表引擎是InnoDB  
    $res=Mysql::$mydqldb->exec($sql);  如果我把这个执行语句  换成框架的Yii::app()->db->createCommand($sql)->execute();  这样就可以回滚$res=Mysql::$mydqldb->exec($sql);  我用的是PDO原生的执行语句就不能回滚
      

  4.   

    表类型是InnoDB  $res=Mysql::$mydqldb->exec($sql);  如果我把这个执行语句  换成框架的Yii::app()->db->createCommand($sql)->execute();  这样就可以回滚$res=Mysql::$mydqldb->exec($sql);  我用的是PDO原生的执行语句就不能回滚
      

  5.   

    那你这个有走到   catch  分支里面去吗?
      

  6.   

    catch 语句调试下var_dump($Exception )  可能抛出的不是这种默认异常,异常无法捕获导致catch块 事务回滚语句没有执行
      

  7.   

    你包装的可真够可以的!一点都看不出 PDO 的影子php 的异常处理是 php5.3 才开始引入的,之前已存在的函数、类、表达式等都不支持异常处理(除了个别重写的以外)
    PDO 是在 php5.1 开始出现的,到 php5.3 才可以无误的使用
    PDO 本身是支持异常处理的,但他出生的环境(php5.1)并不支持异常处理,所以他设计了两套错误处理方案
    要使用 PDO 的异常处理,必须令 PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION
    使用传统错误处理try {
       $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
       $dbh->query('SELECT * from FOO123');//一个不存在的表
    } catch (PDOException $e) {
       print "Error!: " . $e->getMessage() . "<br/>";
    }
    print_r($dbh->errorInfo());使用异常处理try {
       $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
       $dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
       $dbh->query('SELECT * from FOO123');
    } catch (PDOException $e) {
       print "Error!: " . $e->getMessage() . "<br/>";
    }
    print_r($dbh->errorInfo());
    或try {
       $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
       $dbh->query('SELECT * from FOO123');
    } catch (PDOException $e) {
       print "Error!: " . $e->getMessage() . "<br/>";
    }
    print_r($dbh->errorInfo());
    运行后你就会发现:虽然启用了异常处理,传统的错误处理依然时生效的
      

  8.   

    try {
      $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', 
          array(PDO::ATTR_PERSISTENT => true));
      echo "Connected\n";
    } catch (Exception $e) {
      die("Unable to connect: " . $e->getMessage());
    }try {  
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  $dbh->beginTransaction();
      $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
      $dbh->exec("insert into salarychange (id, amount, changedate) 
          values (23, 50000, NOW())");
      $dbh->commit();
      
    } catch (Exception $e) {
      $dbh->rollBack();
      echo "Failed: " . $e->getMessage();
    }
    来着PHP官方文档  http://php.net/manual/zh/pdo.transactions.php
      

  9.   


    还是不行   提示 There is no active transaction  在回滚那里报错
      

  10.   

    <?php
    /**
     * Created by PhpStorm.
     * User: hqj
     * Date: 2018/10/21
     * Time: 22:09
     */class Mysql
    {
        static $pdo;    /*
         * Mysql配置
         * */
        static function construct()
        {
            $dbms='mysql';     //数据库类型
            $host='XXXXXX'; //数据库主机名
            $dbName='XXXXX';    //使用的数据库
            $user='XXXXX';      //数据库连接用户名
            $pass='XXXXXX';          //对应的密码
            $dsn="$dbms:host=$host;dbname=$dbName";
            try {
                static ::$pdo= new PDO($dsn, $user, $pass); //初始化一个PDO对象
            } catch (PDOException $e) {
                die ("Error!: " . $e->getMessage() . "<br/>");
            }
        }    /*
         * 查询数据
         * $true=null默认  null代表查询全部数据  非null代表查询任意一条数据
         * 返回二维数组/一维数组或者空数组  空数组代表无数据
         * 用empty()来判断
         * */
        static function Fetchall($sql,$true=null)
        {
            static ::construct();
            if(!is_null($true)){
            return static ::$pdo->query($sql)->fetch(PDO::FETCH_ASSOC);
            }
            return static ::$pdo->query($sql)->fetchall(PDO::FETCH_ASSOC);
        }
        /*
         * 数据的增 删 改
         * row代表影响的行数
         * id代表最后插入的ID集合
         * 返回false代表操作失败 
         * 返回二维数组代表操作成功
         * */
        static function Exec($data)
        {
            static ::construct();
            if(is_array($data))
            {
                foreach ($data as $v)
                {
                    $id['row'][]=static ::$pdo->exec($v);
                    $id['id'] []=static ::$pdo->lastInsertId();
                }
            }else{
                $id['row'][]=static ::$pdo->exec($data);
                $id['id'] []=static ::$pdo->lastInsertId();
            }        if(in_array(0,$id['row'])){
                return false;
            }
            return $id;
        }    /*封装事务
         * $data是一维数组 里面是每个SQL语句
         * */
        static function Transaction($data)
        {
            static ::construct();
            static ::$pdo->beginTransaction();
            try{
                foreach ($data as $v)
                {
                    static ::Exec($v);
                }
                static ::$pdo->commit();
                return TRUE;
            }catch (Exception $e)
            {
                return $e->getMessage();
                static ::$pdo->rollBack();
            }
        }    /*
         * 开启事务
         * */
        static function BeginTransactions()
        {
            static ::construct();
            static ::$pdo->beginTransaction();
        }
        /*
     * 提交事务
     * */
        static function Commit()
        {
            static ::construct();
            static ::$pdo->commit();
        }
        /*
    * 回滚
    * */
        static function RollBack()
        {
            static ::construct();
            static ::$pdo->rollBack();
        }
    }
    这是我封装的mysql相关语句  麻烦看下 是不是哪里有问题 导致不能回滚