Обнаружение и разрешение конфликтов параллелизма

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

Как объект применения изменений обнаруживает и разрешает конфликты параллелизма

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

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

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

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

После того как объект применения изменений обнаруживает конфликт параллелизма, он разрешает конфликт в соответствии с заданной политикой устранения конфликтов для сеанса или согласно действию по устранению конфликта, заданному приложением для указанного конфликта.

Обнаружение конфликтов параллелизма с использованием объекта применения изменений

Чтобы воспользоваться объектом применения изменений для обнаружения изменений, поставщик назначения сначала создает объект применения изменений.

Управляемый код Создается объект NotifyingChangeApplier.

Неуправляемый код. Создается объект ISynchronousNotifyingChangeApplier с помощью передачи объекта IID_ISynchronousNotifyingChangeApplier методу IProviderSyncServices::CreateChangeApplier.

Затем поставщик назначения должен предоставить информацию о версии для каждого элемента в пакете изменений, отправленном поставщиком источника. Это можно сделать двумя следующими способами.

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

    Управляемый код. Чтобы создать этот список, создайте объект типа System.Collections.Generic.IEnumerable<Microsoft.Synchronization.ItemChange>. Для каждого элемента в пакете изменений поставщика источника добавьте элемент к этому списку, который содержит версию реплики назначения элемента. Передайте этот список объекту применения изменений в качестве параметра destinationVersions соответствующего перегруженного варианта метода, такого как ApplyChanges(ConflictResolutionPolicy, ChangeBatch, IChangeDataRetriever, IEnumerable<(Of <<'(ItemChange>)>>), SyncKnowledge, ForgottenKnowledge, INotifyingChangeApplierTarget, SyncSessionContext, SyncCallbacks).

    Неуправляемый код. Чтобы создать этот список, создайте объект IDestinationChangeVersionsBuilder, вызвав метод IProviderSyncServices::CreateDestinationChangeVersionsBuilder. Для каждого элемента в пакете изменений поставщика источника добавьте элемент к этому списку, который содержит версию реплики назначения элемента, вызвав метод IDestinationChangeVersionsBuilder::AddItemMetadata. Получите перечислитель для списка, вызвав метод IDestinationChangeVersionsBuilder::GetChangeEnumerator, и передайте перечислитель объекту применения изменений в качестве параметра pDestinationVersions метода ApplyChanges.

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

Наконец, поставщик назначения вызывает метод объекта применения изменений ApplyChanges (для управляемого кода) или ISynchronousNotifyingChangeApplier::ApplyChanges (для неуправляемого кода).

Использование объекта применения изменений для разрешения конфликтов параллелизма

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

Приложение синхронизации, как правило, указывает политику устранения конфликтов параллелизма до начала синхронизации.

Управляемый код. Приложение задает политику присваивая значение свойству ConflictResolutionPolicy поставщика назначения.

Неуправляемый код. Приложение указывает политику в параметре resolutionPolicy метода ISyncSession::Start. Поставщик назначения получает эту политику в качестве параметра resolutionPolicy метода IKnowledgeSyncProvider::ProcessChangeBatch.

Поставщик назначения передает политику устранения конфликтов объекту применения изменений, чтобы объект применения изменений мог должным образом запланировать методы для объекта применения изменений целевого объекта. Объект применения изменений целевого объекта представлен объектом INotifyingChangeApplierTarget (для управляемого кода) или объектом ISynchronousNotifyingChangeApplierTarget (для неуправляемого кода).

Платформа Sync Framework определяет следующую политику устранения конфликтов параллелизма.

Политика устранения конфликтов

Описание

SourceWins (для управляемого кода), CRP_SOURCE_PROVIDER_WINS (для неуправляемого кода)

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

DestinationWins (для управляемого кода), CRP_DESTINATION_PROVIDER_WINS (для неуправляемого кода)

Изменение, сделанное в реплике назначения, всегда выигрывает. Это действие поддерживает случай, когда реплика назначения не обрабатывает изменения, выполненные удаленными клиентами. Платформа Sync Framework указывает действие по устранению конфликтов DestinationWins (для управляемого кода) или SRA_ACCEPT_DESTINATION_PROVIDER (для неуправляемого кода).

ApplicationDefined (для управляемого кода), CRP_NONE (для неуправляемого кода)

Объект применения изменений извещает приложение синхронизации о каждом происходящем конфликте с помощью события ItemConflicting (для управляемого кода) или метода ISyncCallback::OnConflict (для неуправляемого кода). Приложение проверяет конфликтующие элементы и указывает действие по устранению конфликтов, вызывая метод SetResolutionAction (для управляемого кода) либо IChangeConflict::SetResolveActionForChange или IChangeConflict::SetResolveActionForChangeUnit (для неуправляемого кода).

Задание устранения пользовательских конфликтов

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

Управляемый код

Неуправляемый код

В ходе синхронизации объект применения изменений вызывает событие ItemConflicting (для управляемого кода) или метод ISyncCallback::OnConflict (для неуправляемого кода) по одному разу для каждого обнаруженного конфликта параллелизма. Приложение может проверить два конфликтующих изменения, внести изменения в метаданные и данные элемента и задать действие по разрешению конфликта с помощью метода SetResolutionAction (для управляемого кода) либо метода IChangeConflict::SetResolveActionForChange или IChangeConflict::SetResolveActionForChangeUnit (для неуправляемого кода). Объект применения изменений обрабатывает конфликт и выполняет диспетчеризацию вызова целевому объекту применения изменений.

Примечание

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

Действия по устранению конфликтов параллелизма, используемые управляемым кодом

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

Действие по устранению конфликтов

Описание

SourceWins

Выигрывает изменение, внесенное в реплике источника. Объект применения изменений передает изменение методу SaveItemChange или SaveChangeWithChangeUnits и указывает действие по сохранению UpdateVersionAndData. Изменение применяется в реплике назначения аналогично любому изменению, не вызывающему конфликт.

DestinationWins

Выигрывает изменение, внесенное в реплике назначения. Объект применения изменений передает изменение только версии методу SaveItemChange или SaveChangeWithChangeUnits и указывает действие по сохранению UpdateVersionOnly. В метаданных в реплике назначения обновляются только сведения о версии элемента. В данные элемента изменения не вносятся.

Merge

Слияние данных элемента источника с элементом назначения. Объект применения изменений передает информацию об изменениях из реплики источника в метод SaveItemChange или SaveChangeWithChangeUnits и указывает действие сохранения UpdateVersionAndMergeData. Поставщик назначения объединяет данные исходного элемента и данные элемента назначения, а затем применяет результат в реплике назначения.

SaveConflict

Конфликт записывается в журнал, и изменение не применяется. Объект применения изменений передает данные о конфликте методу SaveConflict, который сохраняет конфликт в журнал конфликтов. Дополнительные сведения о ведении журнала конфликтов см. в разделе Ведение журнала конфликтов и управление конфликтами.

SkipChange

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

Выигрывает последний модуль записи

Выигрывает последнее произведенное изменение. Приложение получает время совершения изменения в реплике источника и время совершения изменения в реплике назначения путем вызова метода GetItemChangeTime или GetChangeUnitChangeTime для двух этих изменений. Приложение сравнивает два значения времени и указывает действие по устранению конфликтов, применяющее изменение, произведенное последним. Например, если последним было произведено изменение целевой реплики, приложение указывает в качестве действия по устранению конфликтов DestinationWins.

Действия по устранению конфликтов параллелизма, используемые неуправляемым кодом

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

Действие по устранению конфликтов

Описание

SRA_ACCEPT_SOURCE_PROVIDER

Выигрывает изменение, внесенное в реплике источника. Объект применения изменений передает изменение методу ISynchronousNotifyingChangeApplierTarget::SaveChange или ISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits и указывает действие по сохранению SSA_UPDATE_VERSION_AND_DATA. Изменение применяется в реплике назначения аналогично любому изменению, не вызывающему конфликт.

SRA_ACCEPT_DESTINATION_PROVIDER

Выигрывает изменение, внесенное в реплике назначения. Объект применения изменений передает изменение только версии методу SaveChange или SaveChangeWithChangeUnits и указывает действие по сохранению SSA_UPDATE_VERSION_ONLY. В метаданных в реплике назначения обновляются только сведения о версии элемента. В данные элемента изменения не вносятся.

SRA_MERGE

Слияние данных элемента источника с элементом назначения. Объект применения изменений передает информацию об изменениях из реплики источника в метод SaveChange или SaveChangeWithChangeUnits и указывает действие сохранения SSA_UPDATE_VERSION_AND_MERGE_DATA. Поставщик назначения объединяет данные исходного элемента и данные элемента назначения, а затем применяет результат в реплике назначения.

SRA_TRANSFER_AND_DEFER

Конфликт записывается в журнал, и изменение не применяется. Объект применения изменений передает данные о конфликте методу ISynchronousNotifyingChangeApplierTarget::SaveConflict, который сохраняет конфликт в журнале конфликтов. Дополнительные сведения о ведении журнала конфликтов см. в разделе Ведение журнала конфликтов и управление конфликтами.

SRA_DEFER

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

Выигрывает последний модуль записи

Выигрывает последнее произведенное изменение. Приложение получает время совершения изменения в реплике источника и время совершения изменения в реплике назначения путем вызова метода ISupportLastWriteTime::GetItemChangeTime или ISupportLastWriteTime::GetChangeUnitChangeTime для двух этих изменений. Приложение сравнивает два значения времени и указывает действие по устранению конфликтов, применяющее изменение, произведенное последним. Например, если последним было произведено изменение целевой реплики, приложение указывает в качестве действия по устранению конфликтов SRA_ACCEPT_DESTINATION_PROVIDER.

См. также

Справочник

NotifyingChangeApplier

INotifyingChangeApplierTarget

ConflictResolutionAction

ConflictResolutionPolicy

Другие ресурсы

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

Обнаружение и разрешение конфликтов ограничений

Интерфейс ISynchronousNotifyingChangeApplier

Интерфейс ISynchronousNotifyingChangeApplierTarget

Перечисление CONFLICT_RESOLUTION_POLICY

Перечисление SYNC_RESOLVE_ACTION