文档并发更新

Document concurrent update

我有这样的文档:

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

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

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

如果你在文档中存储一些像"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的新值。您还可以在更新后的文档中查看具体更改内容。