2015-02-14 3 views
0

У меня есть документ, как:документов одновременно обновление

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

Два или более пользователи могут обновить живое поле одновременно.

Как я могу убедиться, что только первый пользователь выигрывает и другие обновления не удается?

ответ

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

Смежные вопросы