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


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

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

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

В ходе синхронизации могут возникнуть конфликты двух категорий: конфликты параллелизма и конфликты ограничений.

Конфликты параллелизма

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

Для обнаружения конфликтов параллелизма поставщик назначения обычно использует объект применения изменений, предоставляемый платформой Sync Framework. Объект применения изменений представляется объектом NotifyingChangeApplier (для управляемого кода) или интерфейсом ISynchronousNotifyingChangeApplier (для неуправляемого кода). Чтобы использовать объект применения изменений для обнаружения изменений, поставщик назначения должен предоставить сведения о версии для каждого элемента в пакете изменений, отправленном из поставщика источника. Это можно сделать двумя способами.

  • Поставщик назначения строит список изменений, соответствующий пакету изменений, отправленных поставщиком источника. Для каждого элемента в пакете изменений поставщика источника поставщик назначения добавляет в список элемент, содержащий версию данного элемента в реплике-назначении. Этот список передается в объект применения изменений. Объект применения изменений использует этот список, чтобы проверить, что версия назначения каждого элемента содержится в наборе знаний реплики-источника.

  • Поставщик назначения не передает в объект применения изменений список версий назначения. Вместо этого поставщик назначения реализует метод TryGetDestinationVersion (для управляемого кода) или метод ISynchronousNotifyingChangeApplierTarget::GetDestinationVersion (для неуправляемого кода). Этот метод будет вызываться один раз для каждого элемента в пакете изменений поставщика источника.

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

  1. поставщик назначения определяет, содержится ли в наборе знаний реплики-источника версия элемента из реплики-назначения;

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

Конфликты ограничений

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

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

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

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

Задание политики разрешения конфликтов

Чтобы задать политику, которая будет применяться ко всем конфликтам в ходе сеанса, приложение задает политику разрешения конфликтов в свойстве ConflictResolutionPolicy поставщика назначения (для управляемого кода) или в методе ISyncSession::Start (для неуправляемого кода).

Задание действия по разрешению конфликтов

Чтобы задать действие по разрешению динамически для каждого возникающего конфликта, приложение обрабатывает событие конфликта элемента — событие ItemConflicting (для управляемого кода) или событие ISyncCallback::OnConflict (для неуправляемого кода). Это событие происходит только в случае, если политика разрешения конфликтов имеет значение ApplicationDefined (для управляемого кода) или CRP_NONE (для неуправляемого кода).

Управляемый код. Когда вызывается событие ItemConflicting, обработчик события получает объект ItemConflictingEventArgs, содержащий метаданные и данные элемента для двух изменений, участвующих в конфликте. Обработчик события может изучить двух участников конфликта, внести изменения в метаданные или данные элементов и задать действие по разрешению конфликта с помощью метода SetResolutionAction. Затем платформа Sync Framework обрабатывает конфликт и вызывает необходимые методы поставщика источника или поставщика назначения для применения изменений.

Неуправляемый код. Когда вызывается событие ISyncCallback::OnConflict, обработчик события получает объект IChangeConflict, содержащий метаданные и данные элемента для двух изменений, участвующих в конфликте. Обработчик события может изучить двух участников конфликта, внести изменения в метаданные или данные элементов и задать действие по разрешению конфликта с помощью метода IChangeConflict::SetResolveActionForChange. Затем платформа Sync Framework обрабатывает конфликт и вызывает необходимые методы поставщика источника или поставщика назначения для применения изменений.

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

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

Разрешение конфликтов Описание Доступность в качестве политики сеанса или действия для элемента

Разрешение в пользу источника

Предпочтение всегда отдается реплике-источнику. Это действие поддерживает решение по синхронизации данных, доступных только для чтения, когда реплика-назначение не является доверенной. Объект применения изменений передает изменение в метод SaveItemChange (для управляемого кода) или метод ISynchronousNotifyingChangeApplierTarget::SaveChange (для неуправляемого кода). Изменение применяется в реплике-назначении аналогично любому изменению, не вызывающему конфликт.

Оба варианта

Разрешение в пользу назначения

Предпочтение всегда отдается реплике-назначению. Это действие поддерживает случай, когда реплика-назначение не обрабатывает изменения, выполненные удаленными клиентами. Объект применения изменений передает изменение, вызывающее конфликт, в метод SaveItemChange (для управляемого кода) или метод ISynchronousNotifyingChangeApplierTarget::SaveChange (для неуправляемого кода) в качестве изменения, затрагивающего только версию. К метаданным в реплике-назначении применяются только сведения о версии.

Оба варианта

Слияние

Слияние сведений из двух элементов. Объект применения изменений передает изменение, вызывающее конфликт, в метод SaveItemChange (для управляемого кода) или метод ISynchronousNotifyingChangeApplierTarget::SaveChange (для неуправляемого кода) в качестве изменения со слиянием. Данные элемента из источника и элемента из назначения проходят слияние, а результат применяется к реплике-назначению.

Только действие для элемента

Занесение в журнал

Занесение конфликта в журнал для дальнейшей обработки. Изменение не применяется. Объект применения изменений передает изменение, участвующее в конфликте, в метод SaveConflict (для управляемого кода) или метод ISynchronousNotifyingChangeApplierTarget::SaveConflict (для неуправляемого кода).

Только действие для элемента

Отмена

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

Только действие для элемента

Сохраненные конфликты

Когда конфликт заносится в журнал, вызывается метод SaveConflict (для управляемого кода) или метод SaveConflict (для неуправляемого кода) вместо метода SaveItemChange (для управляемого кода) или метода SaveChange (для неуправляемого кода). В этом случае поставщик должен сохранить набор знаний конфликта, изменение, вызывающее конфликт, и данные конфликта. Затем приложение может перечислить сохраненные конфликты из журнала конфликтов и разрешить их. Учтите, что этот тип разрешения конфликтов всегда вызывает локальное изменение. Поэтому приложение, выполняющее разрешение конфликтов, должно применить результат разрешения в виде локального изменения, обновить счетчик тактов и добавить набор знаний конфликта в локальный набор знаний.

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

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

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

См. также

Справочник

Интерфейс ISyncKnowledge
Интерфейс ISyncProvider
Интерфейс IKnowledgeSyncProvider
IKnowledgeSyncProvider::ProcessChangeBatch
Интерфейс ISynchronousNotifyingChangeApplierTarget
Интерфейс IAsynchronousNotifyingChangeApplierTarget
ISyncCallback::OnConflict
Перечисление CONFLICT_RESOLUTION_POLICY
Перечисление SYNC_RESOLVE_ACTION
SyncKnowledge
KnowledgeSyncProvider
INotifyingChangeApplierTarget
ItemConflicting
ConflictResolutionPolicy
ConflictResolutionAction

Основные понятия

Службы синхронизации
Применение изменений
Основные сведения о наборе знаний синхронизации