文档并发更新
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
的新值。您还可以在更新后的文档中查看具体更改内容。
我有这样的文档:
{
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
的新值。您还可以在更新后的文档中查看具体更改内容。