Berkeley DB:锁定记录而不读取它

Posted

技术标签:

【中文标题】Berkeley DB:锁定记录而不读取它【英文标题】:Berkeley DB: Locking a record without reading it 【发布时间】:2014-10-08 05:20:44 【问题描述】:

我在具有多个线程但只有一个进程的环境中使用带有事务的伯克利数据库。

由于我只有一个进程,我想缓存一些记录中数据的解析表示,这样我就不必每次访问它时都不必要地重新解析它,但如果我这样做在访问缓存数据时天真地没有发出任何数据库操作,我显然不会正确地遵循锁定协议,导致事务不能正确地相互隔离。

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

同样,有没有办法为put 操作执行相应的写锁,因为我需要在修改缓存数据之前执行它们(这需要在序列化数据之前完成,以便实际put它)?

【问题讨论】:

【参考方案1】:

保持(解析的)缓存与底层数据库存储一致并非易事。 您是否考虑过将已解析的数据直接保存在 BerkeleyDB 中以消除解析开销?是的,这涉及架构更改,并且可能还需要更多磁盘空间。

BerkeleyDB 竭尽全力最大限度地减少 mpool 中的 I/O,并且对于正确配置的数据库来说应该是接近最佳的。

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

【讨论】:

以上是关于Berkeley DB:锁定记录而不读取它的主要内容,如果未能解决你的问题,请参考以下文章

Berkeley DB 读取数据失败

Java Berkeley DB 是不是有并发读取的上限?

在 MSAccess 中使用 VBA (ADODB) 将数据从远程 DB 附加到本地表,而不锁定远程 DB 中的记录

使用 berkeley DB 进行数据搜索时出错

如何在不记录/写入 __db.00x 文件的情况下使用 Berkeley Db 事务?

使用 Java 将记录插入 Berkeley DB