【发布时间】:2013-11-01 00:30:34
【问题描述】:
保存点允许数据管理器在不提交完整事务的情况下将工作保存到其存储中。" "保存点还有助于释放内存,否则这些内存将用于保持事务的整个状态。
根据很有启发性的文章When to commit data in ZODB(Martijn Pieters):
...在整个交易过程中,您可以要求将数据临时存储在磁盘上。 [...]
保存点所做的一件事是调用 ZODB 缓存的垃圾收集,这意味着当前未使用的所有数据都将从内存中删除。
问题是,我需要在一个事务中存储很多项目,如下所示:
for i, item in enumerate(aLotOfItems):
database[i]=item
if i % 10000 ==0:
transaction.savepoint(True)
transaction.commit()
我有点期望 transaction.savepoint 的工作方式与 bsddb3.db.Db.sync 相同。当Db.sync()被调用时,数据库被刷新,你可以观察它。但是当设置了保存点时,显然数据库和 tmp 文件都不会增长或改变大小,直到transaction.commit()。
我真的很困惑:
设置保存点后实际发生了什么?
它与提交/刷新数据库有何不同?
如果是“数据暂存到磁盘”,savepoint将数据写入到哪里?
我可以依靠保存点来真正“释放内存”吗?
【问题讨论】:
标签: python transactions zodb