【问题标题】:Does setting autocommit to true take longer than batch committing?将自动提交设置为 true 是否比批量提交花费更长的时间?
【发布时间】:2012-05-29 16:22:03
【问题描述】:

我已经进行了一些试验,如果我将autocommit 设置为False,速度似乎会有所提高。

但是,我担心在我的代码末尾执行一次提交,数据库行将不会更新。因此,例如,我对数据库进行了几次更新,没有提交,查询数据库是否会给我旧数据?或者,它知道它应该先提交吗?

或者,我完全误解了 commit 的实际作用吗?

注意:我正在使用 pyodbc 和 MySQL。另外,我使用的表是 InnoDB,这有什么不同吗?

【问题讨论】:

    标签: python mysql odbc pyodbc


    【解决方案1】:

    有些情况会触发implicit commit。但是在大多数情况下,不提交意味着其他连接将无法使用数据。

    这也意味着如果另一个连接尝试执行与正在进行的事务冲突的操作(另一个连接锁定了该资源),最后一个请求将不得不等待锁被释放。

    至于性能问题,autocommit 使每次更改都立即生效。大型表上的性能损失将非常明显,因为每个 commit 索引和约束也需要更新/检查。如果您只在一系列查询后提交,则索引/约束只会在那时更新。

    另一方面,提交不够频繁可能会导致服务器有太多工作来尝试保持两组数据之间的一致性。所以需要权衡取舍。

    是的,使用InnoDB 会有所作为。例如,如果您使用MyISAM,则根本不会有事务,因此任何更改都将是永久性的(类似于 autocommit=True)。在 MyISAM 上,您可以使用 delay-key-write option

    有关交易的更多信息,请查看official documentation。有关优化的更多提示,请查看this article

    【讨论】:

      【解决方案2】:

      InnoDB 的默认事务模式是 REPEATABLE READ,所有的读取在一个事务中都是一致的。如果您在同一个事务中插入行并查询它们,您将看不到新插入的行,但它们会在您提交事务时存储。
      如果您想在提交事务之前查看新插入的行,可以将隔离级别设置为 READ COMMITTED。

      【讨论】:

        【解决方案3】:

        只要您使用相同的连接,数据库就应该向您显示一致的数据视图,例如包含到目前为止在此交易中所做的所有更改。

        一旦您提交,更改将被写入磁盘并且对其他(新)事务和连接可见。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-05
          • 2020-03-04
          • 2011-06-21
          • 1970-01-01
          • 2011-03-15
          • 1970-01-01
          • 2017-06-18
          • 1970-01-01
          相关资源
          最近更新 更多