在伯克利DB JE中比较和交换



我正在寻找一种在伯克利数据库中实现比较和交换操作的有效方法。现在我使用的是非常旧的版本,但是乍一看,即使是最新版本(从 Oracle 网站分发)也没有用于此类操作的单一方法。

我正在寻找某种方法,例如

replace(Transaction, Key, ExpectedValue, NewValue) 

具有以下语义:DB 获取与给定键关联的值,如果此值存在且等于 ExpectValue,则此值将更改为 NewValue,否则方法返回不成功的 OperationStatus。

看起来没有这样的方法,所以我想知道应该如何以最有效的方式完成此操作。

现在我使用以下方法:我做

db.get(null, key) -> {currentValue, version}
db.put(null, key, {currentValue, newRandomIdVersion}) 
db.get(null, key)

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

我觉得这是非常次优的——我错了吗?

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

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

相关内容

  • 没有找到相关文章

最新更新