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