2010-04-09 6 views
11

Как CouchDB обрабатывает конфликты при выполнении двунаправленной репликации?Разрешение конфликта Couchdb

Например: Допустим, есть две базы данных адресной книги (на серверах A и B). Для Джека есть документ, содержащий контактные данные Джека.

  1. Сервер A и B реплицируются, и обе имеют одну и ту же версию документа Джека.
  2. На сервере A мобильный телефон Джека обновляется.
  3. На сервере B обновлен адрес Джека.
  4. Теперь, когда мы выполняем двунаправленную репликацию, возникает конфликт.

Как это делает couchDB? Если мы инициируем репликацию в Java-программе, есть ли способ узнать, были ли какие-либо конфликты из java-программы?

ответ

17

CouchDB вики имеет подробную explanantion: http://wiki.apache.org/couchdb/Replication_and_conflicts

В двух словах: CouchDB не пытается объединить противоречивые версии. Обе версии копируются в оба реплики. Детерминированный (но с точки зрения приложения, вероятно, произвольный) алгоритм выбирает одну из них как «официальную» версию. Он выберет ту же версию на обеих репликах. Только эта версия будет видна по умолчанию и в представлении. Ваше приложение может запрашивать другие версии и объединять их в соответствии с его потребностями (возможно, с участием пользователя, отображая все версии на экране). Если ваше приложение не ищет конфликтов, одно из двух обновлений будет эффективно потеряно.

Если вы не используете API репликации или массовой загрузки (но API REST для каждого документа), конфликтное обновление не будет внесено в базу данных, но будет отклонено с ошибкой 409. Вы должны объединиться, прежде чем пытаться обновить его снова (как в Subversion).

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

  • Нет связанных вопросов^_^