gpt4 book ai didi

php - PDO:交易不回滚?

转载 作者:可可西里 更新时间:2023-11-01 06:31:32 25 4
gpt4 key购买 nike

我正在浏览 this tutorial关于 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 语句在事务中时它不起作用......

最佳答案

查看 PHP 引用手册:PDO::beginTransaction

Some databases, including MySQL, automatically issue an implicit COMMIT when a database definition language (DDL) statement such as DROP TABLE or CREATE TABLE is issued within a transaction. The implicit COMMIT will prevent you from rolling back any other changes within the transaction boundary.

这解释了为什么会发生这种情况,这是 MySQL 的限制,而不是 PDO/PHP 的限制。

关于php - PDO:交易不回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2426335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com