我有一个名为
Wallet
的表,可以将其视为用户余额。每个用户有一个文档,因此我创建了主键 userId
,并且有一个 balance
字段用于存储用户余额。我最初的想法是,我需要能够从数据库中提取文档,并在更改用户余额之前在应用程序层进行某些检查,因此这排除了我知道是原子的.get(id).update(...)
。
我所做的是添加一个名为
lock
的属性,它是一个字符串。应用程序必须首先.get(id).update({ lock: reallylongstring })
,然后当应用程序准备好提交更改时,它们必须将该锁传递回去,理想情况下,如果锁错误(意味着其他人进来并随后获取了锁),Rethink 将拒绝任何更改。
如果这是 mongo 我会做类似的事情:
this.findOneAndUpdate({
_id: id,
lock: lock
}, {
...
})
然后任何具有错误锁定的更新都会失败,因为找不到文档。在 Rethink 中执行此操作的最佳方法是什么?或者我的方法完全错误,什么是更好的方法?
您可以在
branch
中添加 update
:
.get(id).update(function(row) {
return r.branch(row('lock').eq(LOCK), UPDATE, r.error("error: ..."));
})
像
.getAll(id).filter({lock: LOCK}).update(...)
这样的命令将无法可靠地工作,因为锁定可能会在过滤器和更新之间发生变化。