Поделиться через


Обработка конфликтов

Чтобы обеспечить правильное распространение изменений, вносимых в элементы сообщества синхронизации, поставщик назначения должен выполнять обнаружение и обработку конфликтов, возникающих между элементами, отправленными с поставщика источника, и элементами в реплике назначения. Платформа Sync Framework предоставляет объекты применения изменений, выполняющие основной объем работы, необходимой для обнаружения и обработки конфликтов.

Платформа Sync Framework поддерживает две категории конфликтов, которые могут возникать во время синхронизации: конфликты параллелизма и конфликты ограничений. Конфликты параллелизма возникают, если один и тот же элемент или базовая единица изменяются в двух различных репликах, которые синхронизируются позже. Конфликты ограничений представляют собой конфликты, которые нарушают ограничения, наложенные на элементы или базовые единицы, такие как связь папок или расположение данных с идентичными именами в пределах файловой системы.

Sync Framework позволяет приложению синхронизации указывать порядок обработки конфликтов двумя способами: можно задать политику разрешения конфликтов, которая применяется ко всем конфликтам, возникающим в ходе сеанса, или зарегистрировать приложение для получения уведомлений о каждом обнаруженном конфликте, чтобы выполнять рассмотрение и устранение каждого конфликта в индивидуальном порядке.

Поток операций по обработке конфликтов

Конфликты обнаруживаются и обрабатываются поставщиком назначения в процессе синхронизации на этапе применения изменений. Обычно это выполняется в методе ProcessChangeBatch (для управляемого кода) или ProcessChangeBatch (для неуправляемого кода) в поставщике назначения.

Когда поставщик назначения использует объект применения изменений Sync Framework, для каждого элемента в пакете изменений выполняются следующие действия.

  1. Объект применения изменений проверяет наличие в реплике назначения обновлений для элемента, которые вызывают конфликт параллелизма между элементом и исходным изменением. Например, если элемент изменен локально в реплике-источнике и в реплике назначения, то обнаруживается конфликт операций обновления.

  2. Если приложение установило политику устранения конфликтов параллелизма, то объект применения изменений выбирает действие по устранению конфликта на основании этой политики. В противном случае объект применения изменений сообщает приложению о конфликте, а приложение указывает действие по устранению конфликтов.

  3. Объект применения изменений передает вызов для применения изменения поставщику назначения в соответствии с действием по устранению конфликтов. Например, удалить элемент из реплики назначения и заменить его элементом, полученным от поставщика источника.

  4. Конфликты ограничений обнаруживаются, когда поставщик назначения применяет изменение в реплике назначения. Например, исходное изменение имеет идентификатор id1 и имя «FavoriteBooks», однако в реплике назначения содержится элемент с идентификатором id2, который также имеет имя «FavoriteBooks». Реплика назначения считает элементы совпадающими, поскольку они имеют одинаковые имена, однако Sync Framework считает элементы различными, потому что они имеют разные идентификаторы. Поставщик назначения сообщает о конфликте ограничений объекту применения изменений.

  5. Если приложение указало политику устранения для конфликтов совпадения и конфликт ограничения возник из-за совпадения элементов, то объект применения изменений назначает действие по устранению конфликтов на основании этой политики. В противном случае объект применения изменений сообщает приложению о конфликте, а приложение указывает действие по устранению конфликтов.

  6. Объект применения изменений передает вызов для применения изменения поставщику назначения в соответствии с действием по устранению конфликтов.

Дополнительные сведения об обработке конфликтов параллелизма см. в разделе Обнаружение и разрешение конфликтов параллелизма.

Дополнительные сведения об обработке конфликтов ограничений см. в разделе Обнаружение и разрешение конфликтов ограничений.

Сокращение числа конфликтов за счет применения базовых единиц

Число конфликтов можно сократить за счет применения базовых единиц, представляющих изменения подэлементов. Если используются базовые единицы, версии отслеживаются в базовых единицах, а не во всем элементе. Поэтому изменения, вносимые в различные базовые единицы в пределах одного элемента, не вызывают конфликт. Дополнительные сведения см. в разделе Синхронизация базовых единиц.

Сохранение конфликтов в журнале

Может оказаться полезным сохранять конфликты в журнал, чтобы их можно было обрабатывать вне сеанса синхронизации, например, если пользователь будет просматривать эти конфликты и решать, как их следует разрешать. Кроме того, если конфликты ограничений разрешаются путем слияния данных из двух элементов, участвующих в конфликте, то объект применения изменений в некоторых случаях может сохранять в журнале конфликтов временные конфликты в ходе сеанса синхронизации.

Дополнительные сведения о создании и использовании журнала конфликтов см. в разделе Ведение журнала конфликтов и управление конфликтами.

См. также

Справочник

Интерфейс ISynchronousNotifyingChangeApplier
Интерфейс ISynchronousNotifyingChangeApplierTarget
NotifyingChangeApplier
INotifyingChangeApplierTarget

Основные положения

Реализация стандартного пользовательского поставщика
Применение изменений