PHP 事务不回滚

标签 php mysql transactions

我有一些 PHP 代码可以使用 PHPExcel 读取电子表格并将数据导入 MySQL 数据库。 (innoDB) 如果导入在数据库中遇到重复记录,它应该会失败并回滚所有先前的插入。回滚不起作用,我写了这个功能相同的小程序。

$conn = null;
try {

$conn=new mysqli("myServer","user","password", "moveforward");
$conn->autocommit(FALSE);

$sql="insert into series (seriesLocation,seriesName,seriesDate) values('1','2','2013-05-21')";
echo "Executing query 1<br>";
$conn->query($sql);
if($conn->error!="") {
    $sqlError=$conn->error;
    $conn->rollback();
    echo "Rollback complete<br>";
    throw new Exception($sqlError);
}

//This will throw a duplicate exception
echo "Exceuting query 2<br>";
$conn->query($sql);
if($conn->error!="") { 
    $sqlError=$conn->error;
    $conn->rollback();
    echo "Rollback complete<br>";
    throw new Exception($sqlError);
}
echo "You shouldn't be here<br>";

$conn->commit();
echo "Transactions comitted<br>";

} catch (Exception $e) {
    echo "Exception: " . $e->getMessage() . "<br>";
}
$conn->close();
echo "Done<br>";

在查看 php 手册并检查此处的其他帖子时,这看起来应该可行。当我运行它时,我得到这个:

Executing query 1
Exceuting query 2
Rollback complete
Exception: Duplicate entry '2' for key 'seriesName'
Done

然而,当我检查数据库时,第一个插入的数据就在那里。

有什么想法吗?

最佳答案

我猜你的表没有使用合适的引擎

http://php.net/mysqli.autocommit

This function doesn't work with non transactional table types (like MyISAM or ISAM).

但是,使用 INSERT IGNORE(或 REPLACE 取决于正确的行为)要容易得多。在这种情况下,重复的行将被静默忽略(或替换现有行 (REPLACE))。当然这是行不通的,如果你想知道哪些是重复的。

关于PHP 事务不回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15821167/

相关文章:

mysql - 从 --all-databases 转储导入单个数据库

java - 无法理解 Neo4j JDBC 事务

java - 使用 Spring Data Repository 限制事务数量

php - 如何使用 UploadedFile(例如图像)文件设置 yaml fixtures?

php - 根据数据库中的值检查重叠时间

php - 我需要帮助在 PHP 函数中使用类

mysql - 编写复杂的 MySQL Join 查询

mongodb - 如何使用 MongoDB 转移资金?

javascript - 如果用户关闭浏览器,则从数据库中删除数据

php - Magento 与定制解决方案