【问题标题】:MySQL autocommit - Inserts are ignoredMySQL 自动提交 - 插入被忽略
【发布时间】:2012-05-23 08:15:30
【问题描述】:

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

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

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

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

开启自动提交 = 一切都已插入,但速度非常慢 关闭自动提交 = 一切都非常快,但很多插入都被忽略了

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

【问题讨论】:

    标签: php mysql insert autocommit


    【解决方案1】:

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

    【讨论】:

    • 啊,这就是我所缺少的。非常感谢 :) 现在可以正常工作了 :)
    【解决方案2】:

    你应该这样尝试:

    <?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
    

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 2012-08-11
      相关资源
      最近更新 更多