我正在尝试在一个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。
导致问题的原因是什么以及如何解决?
答案 0 :(得分:1)
与几位评论者建议的一样,事务语义不适用于mySQL中的数据定义语言语句(DDL)。
PDO实现者显然没有尝试在DBMS中没有支持的情况下添加某种客户端事务语义。