PHP事务没有回滚

时间:2013-04-04 20:33:50

标签: 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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

猜猜你的桌子没有使用合适的引擎

http://php.net/mysqli.autocommit

  

此功能不适用于非事务表类型(如MyISAM或ISAM)。

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