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

时间:2015-12-16 15:45:26

标签: rethinkdb

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

您可以在branch中添加update

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

编辑:删除了错误的选项。