Несколько CREATE TABLE с ошибками в одной транзакции - без исключения PDO - PullRequest
3 голосов
/ 05 марта 2012

Я пытаюсь создать четыре таблицы в одной транзакции 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);

После некоторых исследований я обнаружил следующее note на php.net:

Некоторые базы данных, включая MySQL, автоматически выдают неявный COMMIT, когда оператор языка определения баз данных (DDL)например, DROP TABLE или CREATE TABLE выдается в транзакции.

Это то, что вызывает проблему и как ее решить?

1 Ответ

1 голос
/ 11 июня 2012

Как и предлагалось несколько комментариев, семантика транзакций недоступна для операторов языка определения данных (DDL) в mySQL.

Разработчики PDO, очевидно, не пытались добавить какую-либо клиентскую транзакционную семантику, где нет поддержки в СУБД.

...