我在具有多个线程但只有一个进程的环境中使用Berkeley数据库和事务。
因为我只有一个进程,所以我想从一些记录中缓存解析后的数据表示,这样我每次访问它时都不必不必要地重新解析它,但是如果我这样做的话天真地在访问缓存数据时没有发出任何数据库操作,我显然不会正确地遵循锁定协议,导致交易不能彼此正确隔离。
我显然可以通过在我打算在事务中使用的记录上运行get
操作来解决这个问题,但这在I / O方面似乎是不必要的,而且因为我实际上并不需要重新读取数据。有没有办法锁定“好像”我发出了get
操作?
同样,有没有办法为put
操作执行相应的写锁定,因为我需要在修改缓存数据之前执行这些操作(需要在序列化数据之前完成实际操作{ {1}}它)?
答案 0 :(得分:0)
保持(已解析)缓存与底层数据库存储一致并非易事。 您是否考虑过直接在BerkeleyDB中保存已解析的数据以删除解析开销?是的,这涉及架构更改,也可能需要更多磁盘空间。
BerkeleyDB尽可能地减少了mpool中的I / O,并且对于正确配置的数据库来说应该接近最佳状态。
如果您正在使用事务,则在事务提交期间处理get / put操作之间的隔离,而无需额外的锁定。是的,提交可能会失败或破坏另一个提交。如果在更新记录时需要排他性,请在put记录键上添加一个额外的锁定层(使用BerkeleyDB锁定子系统或任何你想要的东西)。