我已经进行了一些试验,如果我将autocommit
设置为False
,速度似乎会有所改善。
但是,我担心在我的代码末尾做一次提交,数据库行不会更新。因此,例如,我对数据库进行了几次更新,没有提交,查询数据库然后给我旧数据?或者,它是否知道它应该先提交?
或者,我完全错误地认为commit
实际上做了什么?
注意:我正在使用pyodbc和MySQL。另外,我正在使用的表是InnoDB,这有什么不同呢?
答案 0 :(得分:2)
有些情况会触发implicit commit。但是,在大多数情况下,不提交意味着数据将无法用于其他连接。
这也意味着如果另一个连接尝试执行与正在进行的事务冲突的操作(另一个连接锁定该资源),则最后一个请求必须等待锁被释放。
至于性能问题,autocommit
会导致每项更改立即生效。对于每个commit
索引,大表上的性能影响非常明显,并且需要更新/检查约束。如果您只在一系列查询后提交,那么索引/约束将仅在那时更新。
另一方面,不经常提交可能会导致服务器尝试维护两组数据之间的一致性而进行太多工作。所以需要权衡。
是的,使用InnoDB
会产生影响。如果您使用的是例如MyISAM
,则根本不会有事务,因此任何更改都将是永久性的(类似于autocommit = True)。在MyISAM上,您可以使用delay-key-write option。
有关交易的更多信息,请查看official documentation。有关优化的更多提示,请查看this article。
答案 1 :(得分:1)
InnoDB的默认事务模式是REPEATABLE READ,所有读取在事务中都是一致的。如果在同一事务中插入行并查询它们,则不会看到新插入的行,但在提交事务时将存储它们。
如果要在提交事务之前查看新插入的行,可以将隔离级别设置为READ COMMITTED。
答案 2 :(得分:0)
只要您使用相同的连接,数据库就会显示数据的一致视图,例如到目前为止在本次交易中所做的所有更改。
提交后,更改将写入磁盘并对其他(新)事务和连接可见。