2014-10-08 98 views
0

我在具有多个线程但只有一个进程的环境中对事务使用Berkeley数据库。Berkeley DB:在不读取记录的情况下锁定记录

因为我只有一个进程,所以我想缓存来自某些记录的数据的解析表示,以便我不必每次访问时都不必要地重新解析它,但是如果我执行如果在访问缓存数据时没有发出任何数据库操作,我会明显不遵守锁定协议,导致事务不能相互隔离。

我明显可以通过在我打算在事务中使用的记录上运行get操作来解决这个问题,但这在I/O方面似乎没有必要,而且也很丑陋,因为我实际上并不需要重新编译,读取数据。有没有办法锁定“好像”我已发出get操作?

同样,有没有办法做到相应的写锁put操作,因为我需要修改的缓存数据(这需要以串行的数据实际上put它之前完成的)之前做呢?

回答

0

保持(分析)缓存与基础数据库存储一致并不重要。 您是否考虑过直接在BerkeleyDB中保存已解析的数据以消除解析开销?是的,这涉及模式更改,并且可能还需要更多的磁盘空间。

BerkeleyDB花费了一些时间来最大限度地减少mpool中的I/O,并且对于正确配置的数据库应该接近最优。

如果使用事务,则在事务提交期间处理get/put操作之间的隔离,而不需要额外的锁定。是的,提交可能会失败或者打断另一个提交。如果在更新记录时需要排他性,则可以在放置记录键上添加额外的锁定层(使用BerkeleyDB锁定子系统或任何您希望的)。

相关问题