我有一个类似的文件:
{
owner: 'alex',
live: 'some guid'
}
两个或更多用户可以同时更新实时字段。
如何确保只有第一个用户获胜而其他更新失败?
答案 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
的新值。您还可以查看更新文档中确切更改的内容。