【问题标题】:PHP transaction not rolling backPHP事务不回滚
【发布时间】:2013-04-04 20:33:50
【问题描述】:

我有一些 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

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

有什么想法吗?

【问题讨论】:

    标签: php mysql transactions


    【解决方案1】:

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

    http://php.net/mysqli.autocommit

    此函数不适用于非事务性表类型(如 MyISAM 或 ISAM)。

    但是,改用INSERT IGNORE(或REPLACE,具体取决于正确的行为)要容易得多。在这种情况下,重复的行会被忽略(或替换现有的行 (REPLACE))。当然,如果您想知道哪些是重复项,这不起作用。

    【讨论】:

    • 默认存储引擎设置为innodb....还有什么我需要做的吗?
    • 看看表真正在运行什么。他们很有可能使用与默认定义的引擎相同的引擎,但我自己会看看它;)
    • 就是这样。我从来没有意识到你可以这样混搭。我改变了它,现在它工作得很好。谢谢!
    猜你喜欢
    • 2015-07-14
    • 2011-09-19
    • 2013-05-13
    • 1970-01-01
    • 2012-07-13
    • 2013-12-15
    • 2011-01-26
    • 2017-03-03
    相关资源
    最近更新 更多