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