多个CREATE TABLE在一个事务中有错误 - 没有PDO异常

时间:2012-03-05 12:04:10

标签: php mysql transactions pdo

我正在尝试在一个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

在事务中发出数据库定义语言(DDL)语句(如DROP TABLE或CREATE TABLE)时,某些数据库(包括MySQL)会自动发出隐式COMMIT。

导致问题的原因是什么以及如何解决?

1 个答案:

答案 0 :(得分:1)

与几位评论者建议的一样,事务语义不适用于mySQL中的数据定义语言语句(DDL)。

PDO实现者显然没有尝试在DBMS中没有支持的情况下添加某种客户端事务语义。