PDO: Транзакции не откатывают?

Я прохожу это учебное руководство о PDO и перешел к сути дела о транзакциях. Пропуская части соединения, у меня есть этот код php:

try
{
    $db->beginTransaction();

    $db->exec('DROP TABLE IF EXISTS animals');

    $db->exec('CREATE TABLE animals ('
        .'animal_id MEDIUMINT(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,'
        .'animal_type VARCHAR(25) NOT NULL,'
        .'animal_name VARCHAR(25) NOT NULL)'
        .'ENGINE=INNODB');

    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("emu", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("funnel web", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("lizard", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("dingo", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("kangaroo", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("wallaby", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("wombat", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("koala", "bruce")');
    $db->exec('INSERT INTO animals (animal_type, animal_name) VALUES ("kiwi", "bruce")');

    $db->commit();

    echo 'Table re-created and data entered successfully.';
}
catch(PDOException $e)
{
    $db->rollback();

    echo $e->getMessage();
}

Это работает большой, и как я думал, что это было бы, кроме того, если бы я вставил ошибку где-нибудь. Как то, если бы я создал ошибку в четвертом операторе вставки, то я нашел бы трех животных в своей базе данных. Но я думал, что вещи, как предполагалось, откатывались, означая, что я найду, что база данных как он была, прежде чем я запустил этот скрипт.

Я неправильно понял что-то? Что я пропускаю? Транзакция и откатывают функции, делают что-то еще, чем, что я думаю, что они должны делать? Отбрасывание, и создайте операторы, "повреждающие" транзакцию так или иначе? Что продолжается здесь?


Обновление: Если я перемещаюсь $db->beginTransaction(); строка так транзакция начинается только после того, как таблица была составлена, я получаю поведение, которое я ожидал. Таким образом, если бы третий оператор вставки затем перестал работать, то у меня была бы пустая таблица (так как он был просто воссоздан) после того, как транзакция откатывалась. Все еще удивление, почему это не работает, когда отбрасывание и создают операторы, находится в транзакции хотя...

8
задан Svish 11 March 2010 в 15:52
поделиться

1 ответ

См. Справочное руководство по PHP: PDO :: beginTransaction

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

Это объясняет, почему это происходит, и это ограничение MySQL, а не PDO / PHP.

19
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: