我正在寻找一种在Berkeley DB中实现比较和交换操作的有效方法。现在我正在使用非常旧的版本,但是乍一看即使是最新的版本(从Oracle网站发布)也没有一种方法可以用于此类操作。
我正在寻找某种方法,比如
replace(Transaction, Key, ExpectedValue, NewValue)
具有以下语义:DB获取与给定键关联的值,如果此值存在且等于ExpectedValue,则此值将更改为NewValue,否则方法将返回不成功的OperationStatus。
看起来没有这样的方法,所以我想知道这应该如何以最有效的方式完成。
现在我正在使用以下方法:我做
db.get(null, key) -> {currentValue, version}
db.put(null, key, {currentValue, newRandomIdVersion})
db.get(null, key)
我比较价值和版本,如果匹配我做最后更新删除旧版本。如果任何步骤失败,则整个过程重新开始。
我觉得这非常不理想 - 我错了吗?
答案 0 :(得分:0)
我对我的问题进行更新的解决方案是错误的 - 但是只需稍作修改就可以使其更好。
解决方案可能如下:创建单独的DB来存储锁,这些锁将保存一些计数器的密钥关联。此DB应允许排序重复(以便Database.get将返回与给定键关联的最小值)。然后使用共享单调递增计数器。尝试执行CAS的多个线程将从此计数器获取值并将键值对存储在该锁定DB中。存储与密钥关联的最低值的线程假定它具有写入权限并继续进行所需记录的比较和交换,然后从锁DB中删除其条目,其他线程只需重试。