【问题标题】:Database commit: Which is the preferred way and why?数据库提交:哪个是首选方式,为什么?
【发布时间】:2016-01-06 19:05:21
【问题描述】:

哪一种是首选的提交方式?这两种方法的内部究竟发生了什么?

1:

for item in items:
        cursor2.execute(query3, [some_parameter])
        connection1.commit()

2:

for item in items:
        cursor2.execute(query3, [some_parameter])
connection1.commit()

【问题讨论】:

    标签: python sql database commit


    【解决方案1】:

    方法一

    • 将需要更多时间,因为它必须逐项提交对数据库的更改;
    • 需要更多 I/O(访问硬盘);
    • 如果第二个查询发生错误,则第一个查询已经提交。

    方法二

    • 会执行得更快,因为它只提交一次更改;
    • 需要更少的 I/O;
    • 如果第二个查询发生错误,则回滚第一个查询;

    第二种方法类似于批量插入,因为它仅在执行所有查询时提交所有更改。

    【讨论】:

      【解决方案2】:

      假设您的查询正在修改数据:

      第一种方法意味着数据库将在每次迭代(逐项)时根据您的更改进行更新。第二种方法意味着在您完成所有项目以及您所做的所有更改后,只会有一次更新。

      第一种方法的潜在问题可能是:

      • 如果您由于某种原因没有完成迭代周期,则数据不一致,并且重要的是拥有所有更新或没有更新;

      • 如果其他人在您更新该数据集时查询该数据集,则数据不一致;

      • 如果您发送太多更新请求(尤其是当每个更新请求都锁定一个或多个表时)会出现拥塞。

      第二种方法的潜在问题可能是:

      • 一次发送太多数据导致的错误;

      • 其他人可能以不同的方式修改了相同的数据集,然后由于您的更新而丢失了这些更改,更新是对处于早期状态的这些数据进行的。根据事务隔离级别,这可能会导致数据不一致或您的事务被拒绝。

      选择哪种方法取决于特定的用例。

      【讨论】:

        【解决方案3】:

        据我了解,connection1.commit() 会将更改写入数据库。

        在第一个示例中,您每次都在提交,这可能需要更长的时间,但“更安全”(如果发生崩溃,更多的数据将写入数据库)。

        在第二个示例中,您在进行所有更改后写入数据库。由于这只是一次写入操作,因此花费的时间更短,尽管从技术上讲它不太“安全”。

        在正常环境中,简称 for 循环,我会选择第二个。如果您的代码需要数小时才能运行,那么第一种方法可能更适合您。

        【讨论】:

          猜你喜欢
          • 2012-04-02
          • 2010-09-05
          • 2011-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-08
          • 2019-12-06
          相关资源
          最近更新 更多