【问题标题】: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 循环,我会选择第二个。如果您的代码需要数小时才能运行,那么第一种方法可能更适合您。