Я прохожу это учебное руководство о 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();
строка так транзакция начинается только после того, как таблица была составлена, я получаю поведение, которое я ожидал. Таким образом, если бы третий оператор вставки затем перестал работать, то у меня была бы пустая таблица (так как он был просто воссоздан) после того, как транзакция откатывалась. Все еще удивление, почему это не работает, когда отбрасывание и создают операторы, находится в транзакции хотя...
См. Справочное руководство по PHP: PDO :: beginTransaction
Некоторые базы данных, включая MySQL, автоматически выдают неявный COMMIT, когда в транзакции выдается оператор языка определения базы данных (DDL), такой как DROP TABLE или CREATE TABLE. Неявный COMMIT предотвратит откат любых других изменений в границах транзакции.
Это объясняет, почему это происходит, и это ограничение MySQL, а не PDO / PHP.