Разрешение конфликтов Couchdb

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

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

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

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

Ответ 1

В wiki для CouchDB есть подробное объяснение: http://wiki.apache.org/couchdb/Replication_and_conflicts

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

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