如何在 RethinkDB 中仅使用主键进行原子更新?

问题描述 投票:0回答:1

我有一个名为

Wallet
的表,可以将其视为用户余额。每个用户有一个文档,因此我创建了主键
userId
,并且有一个
balance
字段用于存储用户余额。我最初的想法是,我需要能够从数据库中提取文档,并在更改用户余额之前在应用程序层进行某些检查,因此这排除了我知道是原子的
.get(id).update(...)

我所做的是添加一个名为

lock
的属性,它是一个字符串。应用程序必须首先
.get(id).update({ lock: reallylongstring })
,然后当应用程序准备好提交更改时,它们必须将该锁传递回去,理想情况下,如果锁错误(意味着其他人进来并随后获取了锁),Rethink 将拒绝任何更改。

如果这是 mongo 我会做类似的事情:

this.findOneAndUpdate({
  _id: id,
  lock: lock
}, {
  ...
})

然后任何具有错误锁定的更新都会失败,因为找不到文档。在 Rethink 中执行此操作的最佳方法是什么?或者我的方法完全错误,什么是更好的方法?

rethinkdb
1个回答
4
投票

您可以在

branch
中添加
update

.get(id).update(function(row) {
  return r.branch(row('lock').eq(LOCK), UPDATE, r.error("error: ..."));
})

.getAll(id).filter({lock: LOCK}).update(...)
这样的命令将无法可靠地工作,因为锁定可能会在过滤器和更新之间发生变化。

© www.soinside.com 2019 - 2024. All rights reserved.