2015-10-09 34 views
-1

哪一个是首选的提交方式?这两种方法在内部究竟发生了什么?数据库提交:哪个是首选方式,为什么?

1:

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

2:

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

回答

0

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

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

在第二个示例中,在所有更改完成后,您正在写入数据库。由于这只是一次写入操作,所需的时间会更少,尽管从技术上讲它不太“安全”。

在正常的环境中,并简称为循环,我会去第二个。如果您的代码需要数小时才能运行,那么第一种方法可能对您更好。

0

假设你的查询修改数据:

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

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

  • 数据不一致,如果你因为某些原因没有完成迭代周期,这是重要的是要有要么所有的更新或没有人的;

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

  • 拥塞如果您发送太多更新请求(尤其是如果他们每个人都锁定一个或多个表)。

与第二种方法可能遇到的问题可能是:

  • 由于一次发送太多的数据错误;

  • 别人可能已经修改了相同的数据以不同的方式设置,然后输,因为你的更新,这是在他们的早期状态的数据所做的这些更改。根据事务隔离级别,这可能导致数据不一致或您的事务被拒绝。

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

0

1的方法,

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

因为它提交更改仅一次2

  • 将执行更快的方法;
  • 它占用更少的I/O;
  • 如果在第二个查询中发生错误,则回滚第一个查询;

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

相关问题