1

我正在寻找一种在 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)

我比较值和版本,如果它们匹配,我会进行最终更新,删除旧版本。如果任何步骤失败,则整个过程重新开始。

我觉得这是非常不理想的——我错了吗?

4

1 回答 1

0

我对我的问题的更新解决方案是错误的 - 但是只需稍作修改即可使其变得更好。

解决方案可能如下:创建单独的数据库来存储将键关联到某个计数器的锁。该数据库应允许排序重复(以便 Database.get 将返回与给定键关联的最小值)。然后使用共享单调递增计数器。尝试执行 CAS 的多个线程将从该计数器获取值并将键值对存储在该锁定数据库中。存储与键关联的最低值的线程假定它具有写入权限并继续比较并交换所需记录,然后从锁定数据库中删除其条目,其他线程简单地重试。

于 2016-07-17T23:33:24.217 回答