我有一个名为Wallet
的表,它可以被认为是用户平衡。每个用户有一个文档,所以我制作了主键userId
,还有一个存储用户余额的balance
字段。我最初的想法是,在更改用户平衡之前,我需要能够从DB中提取文档,并在应用程序层进行某些检查,所以这排除了.get(id).update(...)
,我知道它是原子的。
相反,我添加了一个名为lock
的属性,它是一个字符串。应用程序必须首先.get(id).update({ lock: reallylongstring })
,然后当应用程序准备好提交更改时,他们必须将该锁传回,理想情况下,如果锁错误(意味着其他人进来并在之后获得了锁),Rethink将拒绝任何更改。
如果这是mongo,我会做一些类似的事情:
this.findOneAndUpdate({
_id: id,
lock: lock
}, {
...
})
然后,任何锁定错误的更新都会失败,因为找不到文档。在"反思"中,最好的方法是什么?或者我的方法完全是错误的,还有什么更好的方法呢?
您可以在update
:中放入branch
.get(id).update(function(row) {
return r.branch(row('lock').eq(LOCK), UPDATE, r.error("error: ..."));
})
EDIT:删除了不正确的选项。