7

我看到了一个类似于我的问题,但一般是针对 SQL 数据库的。它说当您插入数据但在提交之前,仅保存命令并将它们保存在 RAM 中。只有在提交之后才会清空 RAM 并将数据存储在数据库中。

但是,我想我注意到使用 sqlite3 和 Python 的不同行为。我在脚本的最后留下了我的提交。我的程序空间不足并中途中止,但这不是因为 RAM 已满。它说磁盘空间已满,我确认我的计算机上确实已满,其中很大一部分被我的数据库文件占用了。

我知道我需要更多的磁盘空间来创建这个数据库,这不会成为问题,但我想知道,至少特别是对于 sqlite3 和 Python(如果特定情况很重要),我之前的数据/命令实际发生了什么提交?换句话说,它们在哪里以及如何存储?不同的数据库有区别吗?在使用数据库时,我是否应该担心用完所有的 RAM,直到最后才提交?

4

1 回答 1

5

SQLite 将未修改的数据页面复制到临时回滚日志文件中,并将您的更改应用于这些相同页面的内存副本。当您进行了足够多的更改以致内存成为问题时,更改将被刷新到原始数据库中。回滚日志用于回滚不完整的事务。

不同的数据库如何处理回滚日志很大程度上取决于数据库的实现。一个符合 ACID 的数据库必须在某处存储未提交的事务数据,而磁盘支持的日志是一个明显的选择。

SQLite 文档包含关于它如何准确地实现事务的详尽解释。

于 2013-08-29T15:56:35.410 回答