MySQL自动提交 - 插入被忽略

时间:2012-05-23 08:15:30

标签: php mysql insert autocommit

我有一个MySQl数据库,包含几个表,所有UTF-8和MyISAM存储。 在PHP中,我正在解析一个XML文件,该文件将大量数据写入表中。我只使用简单的Insert语句和mysqli函数。

表上没有那么多读取操作,插入过程中没有任何一个操作。首先,性能非常慢,所以我在脚本的开头添加了SET AUTOCOMMIT = 0。

我现在遇到的问题是我所有的插页都在例如第三个foreach循环被忽略,不会出现在mysql表中。在此之前的一切都很好。

所以我的问题是,我做错了什么,我应该怎么做?

启用自动提交=插入所有内容但非常慢 自动提交关闭=一切都很快但很多插入被忽略

希望有人有一个想法,可以提供帮助。

2 个答案:

答案 0 :(得分:1)

关闭自动提交的MySQL速度更快,因为INSERT不会立即写入数据库;只有在执行COMMIT语句时才会保存数据。插入数据后是否有COMMIT语句?

答案 1 :(得分:1)

你应该这样试试:

<?php
try {
    $db->beginTransaction();

    $stmt = $db->prepare("SOME QUERY?");
    $stmt->execute(array($value1));

    $stmt = $db->prepare("YET ANOTHER QUERY??");
    $stmt->execute(array($value2, $value3));

    $db->commit();
} catch(PDOException $ex) {
    //Something went wrong then rollback!
    $db->rollBack();
    echo $ex->getMessage();
}

注意:调用bindTransaction()会自动关闭自动提交。


使用mysqli时,您可以使用以下代码:

mysqli_autocommit($dbh, FALSE);    // turn off auto-commit
mysqli_rollback($dbh);    // if error, roll back transaction
mysqli_commit($dbh);    // commit transaction