2012-03-05 7 views
3

1つのPDOトランザクション内に4つのテーブルを作成しようとしています。1つのトランザクション内でエラーが発生した複数のCREATE TABLE - PDO例外なし

ステートメントの最初の "CREATE TABLE ..."部分にエラーが含まれていると、例外、エラーメッセージ、およびロールバックが正常に取得されます。しかし、最初の "CREATE TABLE ..."部分が(以下の例のように)正しく書かれても、例外はなく、コミットされ、最初のテーブルだけが作成されます。

は、ここでは、コードです:

$conn = Connection::getInstance(); 

$conn->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$conn->dbh->beginTransaction(); 

$stmt = $conn->dbh->prepare(" 
CREATE TABLE IF NOT EXISTS `1st table` (valid SQL-code) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 

CREATE TABLE IF NOT EXISTS `2nd table` (SQL-code with an error) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 

CREATE TABLE IF NOT EXISTS `3rd table`... 
CREATE TABLE IF NOT EXISTS `4th table`... 
"); 
try 
{ 
    $stmt->execute(); 
    $conn->dbh->commit(); 
} 
catch (Exception $e) 
{ 
    $conn->dbh->rollBack(); 
    echo $e->getMessage(); 
} 

unset($stmt); 

いくつかの研究の後、私はphp.netで次noteが見つかりました:

のMySQLなどのデータベースの中には、自動的に暗黙的に発行したときにデータベース定義言語COMMIT(DDL DROP TABLEやCREATE TABLEなどの文がトランザクション内で発行されます。

問題の原因とその解決方法は何ですか?

+0

ステートメントを個別に連続して実行しない理由はありますか?私はそのような単一の呼び出しで複数のステートメントを実行することはありませんでした。 –

+0

すべてのテーブルを1つのトランザクションで作成したいとします。 SQLコードにエラーがある場合、私はそれらのどれも作成されたくない。 – Placido

+0

1回の呼び出しで複数のPDO文を実行することができます。 SQLコードにエラーがなければ、4つのテーブルがすべて正常に作成されます。 – Placido

答えて

1

いくつかのコメント者が示唆しているように、トランザクションのセマンティクスは、mySQLのデータ定義言語ステートメント(DDL)では使用できません。

PDOの実装者は明らかに、DBMSのサポートがない場合にクライアント側のトランザクションセマンティクスを追加しようとしませんでした。

関連する問題