Разрешение конфликтов CouchDB - PullRequest
11 голосов
/ 09 апреля 2010

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

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

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

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

1 Ответ

18 голосов
/ 09 апреля 2010

Документация CouchDB предлагает объяснение.

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

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

...