Обработка конфликтов в CouchDB
Скажем, у меня есть документ с двумя свойствами: "Начало" и "Конец". Одна ревизия может иметь время для начала и ноль для конца и наоборот. Вместо того, чтобы выбрать одну ревизию в качестве победителя, я хочу, чтобы последний документ содержал время начала ревизии, где оно не равно нулю, и то же самое для конца.
Существуют ли передовые методы для обработки этого типа разрешения конфликтов во время синхронизации? Документация, которую я нашел, содержит инструкции по выбору одной ревизии в качестве победителя, но я бы хотел выбрать значения из нескольких оборотов.
Примеры, специфичные для библиотеки C#/MyCouch, были бы хорошими, но любой общий или другой языковой совет также высоко ценится.
1 ответ
Вы не можете указать пользовательский способ разрешения конфликтов во время репликации (или синхронизировать). CouchDB автоматически выбирает ревизию победителя, и вы не можете влиять на это:
По умолчанию CouchDB выбирает одну произвольную ревизию в качестве "победителя", используя детерминистический алгоритм, так что один и тот же выбор будет сделан для всех пиров.
Вы можете дождаться окончания репликации и обработки конфликтов после этого, выполнив объединение редакций документа для конкретного приложения.
Просматривая документацию по работе с конфликтующими документами, я нашел следующий пример псевдокода:
- ПОЛУЧИТЬ docid? Конфликтов = верно
- Для каждого члена в массиве _conflicts: GET docid? Rev=xxx Если на этом этапе произойдут какие-либо ошибки, перезапустите с шага 1. (Может быть гонка, где кто-то еще уже разрешил этот конфликт и удалил эту версию)
- Выполнить слияние для конкретного приложения
- Напишите _bulk_docs с обновлением до первой версии и удалите другие версии.