数据库提交:哪种方式首选?为什么?

时间:2015-10-09 00:19:58

标签: python sql database commit

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

1

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

2:

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

3 个答案:

答案 0 :(得分:0)

据我所知connection1.commit()将更改写入数据库。

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

在第二个示例中,您在完成所有更改后写入数据库。因为这只是一次写操作,所以花费的时间会更少,但从技术上来说,它的安全性较低。

在正常环境中,以及简称for循环,我会选择第二个。如果你的代码需要几个小时才能运行,那么第一种方法对你来说可能更好。

答案 1 :(得分:0)

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

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

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

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

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

  • 如果您发送了太多更新请求(特别是如果每​​个更新请求都锁定了一个或多个表),则会出现拥塞。

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

  • 由于一次发送过多数据而导致错误;

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

选择哪种方法取决于具体的用例。

答案 2 :(得分:0)

方法1

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

方法2

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

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