我正在阅读有关 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();
}
它运行得很好,就像我想的那样,除非我在某个地方输入了错误。就像我在第四个插入语句中创建了一个错误一样,我会在我的数据库中找到三只动物。但我认为事情应该被回滚,这意味着我会在运行这个脚本之前找到数据库。
我误解了什么吗?我错过了什么?事务和回滚函数是否做了我认为他们应该做的其他事情?drop 和 create 语句是否以某种方式“破坏”了事务?这里发生了什么?
更新:如果我移动该$db->beginTransaction();
行以便事务仅在表创建后开始,我会得到我期望的行为。因此,如果第三个插入语句随后失败,则在事务回滚后我将有一个空表(因为它刚刚重新创建)。仍然想知道为什么当 drop 和 create 语句在事务中时它不起作用......