PDO回滚无效

时间:2016-08-31 06:01:00

标签: php

我希望看到rollback的效果。但是每次运行代码时,即使我调用了回滚,表也会被删除。 我有以下代码

    <?php 
    define('DBNAME','test');
    define('DBUSER','root');
    define('DBHOST','localhost');
    define('PASS','');

    $dbh = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME,DBUSER,PASS);

    /* Begin a transaction, turning off autocommit */
    $dbh->beginTransaction();

    $sth = $dbh->prepare("DROP TABLE calendar2");
     $result = $sth->execute();

    /* Change the database schema and data */
    if(!$result )
        $dbh->commit();
    else
        $dbh->rollback();

    ?>

1 个答案:

答案 0 :(得分:1)

  

注意:并非所有数据库都允许事务对DDL语句进行操作:某些数据库将生成错误,而其他数据库(包括MySQL)将在遇到第一个DDL语句后自动提交事务。 - http://php.net/manual/en/pdo.commit.php

MySQL中的DROP TABLECREATE TABLE等数据库定义语言(DDL)语句不能在事务中使用。

  

在事务中发出数据库定义语言(DDL)语句(如COMMITDROP TABLE时,某些数据库(包括MySQL)会自动发出隐式CREATE TABLE。隐式COMMIT将阻止您回滚事务边界内的任何其他更改。 - http://php.net/manual/en/pdo.rollback.php

因此,当发出DDL语句时,它就像在DDL语句之后立即调用commit()一样。您无法回滚DDL语句,并且因为隐式调用commit(),您也无法在DDL语句之前回滚任何内容。