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などの文がトランザクション内で発行されます。
問題の原因とその解決方法は何ですか?
ステートメントを個別に連続して実行しない理由はありますか?私はそのような単一の呼び出しで複数のステートメントを実行することはありませんでした。 –
すべてのテーブルを1つのトランザクションで作成したいとします。 SQLコードにエラーがある場合、私はそれらのどれも作成されたくない。 – Placido
1回の呼び出しで複数のPDO文を実行することができます。 SQLコードにエラーがなければ、4つのテーブルがすべて正常に作成されます。 – Placido