Language agnostic Berkeley DB:在不读取记录的情况下锁定记录

Language agnostic Berkeley DB:在不读取记录的情况下锁定记录,language-agnostic,locking,berkeley-db,Language Agnostic,Locking,Berkeley Db,我在一个有多个线程但只有一个进程的环境中使用伯克利数据库处理事务 因为我只有一个进程,所以我想缓存一些记录中的数据的解析表示,这样我就不必每次访问它时都不必要地重新解析它,但是如果我在访问缓存数据时天真地这样做,而不发出任何数据库操作,我显然不会正确地遵循锁定协议,导致交易不能正确地相互隔离 显然,我可以通过对我打算在事务期间使用的记录运行get操作来解决这个问题,但这在I/O方面似乎是不必要的,而且也很难看,因为我实际上不需要重新读取数据。有没有一种方法可以“像”我发出了一个get操作一样进行

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

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

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

类似地,有没有一种方法可以为
put
操作执行相应的写锁,因为我需要在修改缓存数据之前执行写锁(这需要在序列化数据之前执行,以便实际
put
操作)?

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

BerkeleyDB在尽可能减少mpool中的I/O方面做了一些工作,对于正确配置的数据库来说,它应该是接近最优的

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