2016-08-31 5 views
1

ロールバックの効果を見たいのですが、コードを実行するたびに、ロールバックを呼び出してもテーブルが削除されてしまいます。 私はコードPDOロールバックが機能していない

<?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

データベースタイプとしてINNODBを使用していることを確認する必要があります。 MyISAMはトランザクションをサポートしていません。 – Pratik

答えて

1

次の点に注意してくださいしている:すべてのデータベースがトランザクションがDDL文を操作できるようになります:いくつかのエラーが発生します、最初のDDL文があり後(のMySQLを含む)他の人が自動的にトランザクションをコミットします一方を遭遇した。 - そのようDROP TABLECREATE TABLEなどhttp://php.net/manual/en/pdo.commit.php

データベース定義言語(DDL)文で、MySQLでは、トランザクションの範囲内で使用することはできません。

のMySQLを含むいくつかのデータベースを、このようなDROP TABLECREATE TABLEなどのデータベース定義言語(DDL)文がトランザクション内で発行されたときに自動的に暗黙のCOMMITを発行します。暗黙的なCOMMITは、トランザクション境界内の他の変更をロールバックできないようにします。 - http://php.net/manual/en/pdo.rollback.php

だから、DDL文が発行されたときには、DDL文の直後にcommit()を呼び出すようなものです。は暗黙的に呼び出されるため、DDL文の前には何もロールバックすることができないため、DDL文をロールバックすることはできません。

関連する問題