1

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

表上没有那么多读取操作,并且在插入期间没有一个操作。首先,性能非常非常慢,所以我在脚本开头添加了 SET AUTOCOMMIT = 0。

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

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

开启自动提交 = 插入所有内容,但速度非常慢 关闭自动提交 = 速度非常快,但忽略了很多插入

希望有人有想法并可以提供帮助。

4

2 回答 2

2

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

于 2012-05-23T08:22:17.313 回答
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
于 2012-05-23T08:30:26.720 回答