记录并发更新

时间:2015-02-14 00:55:09

标签: rethinkdb

我有一个类似的文件:

{
  owner: 'alex',
  live:  'some guid'
}

两个或更多用户可以同时更新实时字段。

如何确保只有第一个用户获胜而其他更新失败?

1 个答案:

答案 0 :(得分:1)

如果存储一些变量,例如" times_updated"您可以获得所需的语义。在文件中。对单个文档的操作是原子的,因此您可以检查该字段是否是您期望的值,然后如果不是,则抛出错误。

它可能看起来像:

var timesUpdated = 3

r.table('foo').get(rowId).update(function(row) {
     return r.branch(row('timesUpdated').eq(timesUpdated),
          {
              timesUpdated: row('timesUpdated').add(1),
              live: 'some special value'
          },
          r.error('Someone else updated the live field!')
     );
}, {returnChanges: true})

因此,如果您在timesUpdated = 3之前收到其他查询,那么您的查询就会爆炸。你什么时候得到timesUpdated?这取决于您的应用的设计方式以及您尝试做的事情。

另外需要注意的是,添加{returnChanges: true}非常有用,因为它允许您以原子方式获取timesUpdated的新值。您还可以查看更新文档中确切更改的内容。