Вы можете получить семантику, которую хотите, если вы сохраните некоторую переменную типа «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
атомарно. Вы также можете увидеть, что именно изменилось в обновленном документе.