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


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

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

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

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

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

Виды конфликтов ограничений

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

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

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

  • Другие конфликты ограничений возникают, когда сохраняемый элемент нарушает какое-либо ограничение реплики назначения. Например, исходный поставщик отправляет файл, слишком большой для размещения на реплике назначения, либо изменение нарушает какое-либо из правил бизнес-логики на реплике назначения. В качестве примера конфликта бизнес-логики рассмотрим реплику низкой достоверности, в которой хранятся две базовые единицы: name и country. Также рассмотрим реплику высокой достоверности, в которой хранятся три базовые единицы: name, state/province и country. Реплика высокой достоверности содержит бизнес-логику, которая проверяет значение поля state/province по значению поля country и не сохраняет изменение, не прошедшее проверку. Реплика низкой достоверности выступает в качестве источника и отправляет элемент, в котором поле country имеет значение «USA». Поставщик назначения применяет изменение в реплике высокой достоверности, однако в этой реплике поле state/province элемента имеет значение «British Columbia». Поэтому данное изменение нарушает бизнес-логику и вызывает конфликт ограничения.

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

Причина конфликта ограничения Описание

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

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

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

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

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

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

Обнаружение и выдача сообщений о конфликтах ограничений

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

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

Управляемый код Конфликты ограничений, как правило, обнаруживаются поставщиком назначения во время выполнения метода SaveItemChange или SaveChangeWithChangeUnits, а сообщение выдается вызовом метода RecordConstraintConflictForItem или RecordConstraintConflictForChangeUnit.

Неуправляемый код Конфликты ограничений, как правило, обнаруживаются поставщиком назначения при выполнении метода ISynchronousNotifyingChangeApplierTarget::SaveChange или ISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits, а сообщение выдается вызовом метода ISaveChangeContext2::SetConstraintConflictOnChange или ISaveChangeWithChangeUnitsContext2::SetConstraintConflictOnChangeUnit.

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

  • Если конфликт ограничения представляет собой конфликт совпадения, то объект применения изменений определяет его тип: новый конфликт, временный конфликт или распространение разрешения слиянием. Объект применения изменений во время обработки конфликта может временно сохранить конфликт в журнале конфликтов, вызвав метод SaveConstraintConflict (для управляемого кода) или метод ISynchronousNotifyingChangeApplierTarget2::SaveConstraintConflict (для неуправляемого кода). Объект применения изменений удаляет временные конфликты из журнала в конце сеанса синхронизации.

  • Разрешает конфликты совпадения в соответствии с политикой устранения конфликтов совпадения, заданной для сеанса, или в соответствии c действием по устранению конфликта, определенному приложением. Приложение вызывается для определения действия по разрешению конфликта, если политика устранения конфликтов совпадения задана как ApplicationDefined (для управляемого кода) или CCRP_NONE (для неуправляемого кода).

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

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

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

Определение политики устранения конфликтов совпадения

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

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

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

Поставщик назначения передает политику устранения конфликтов совпадения методу ApplyChanges (для управляемого кода) или ISynchronousNotifyingChangeApplier2::ApplyChanges (для неуправляемого кода) объекта применения изменений, чтобы объект применения изменений мог выполнить диспетчеризацию методов целевого объекта применения изменений. Объект применения изменений целевого объекта представлен интерфейсом INotifyingChangeApplierTarget2 (для управляемого кода) или ISynchronousNotifyingChangeApplierTarget2 (для неуправляемого кода)

Политика устранения конфликтов совпадения для управляемого кода

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

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

SourceWins

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

DestinationWins

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

RenameSource

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

RenameDestination

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

Merge

Данные из элемента источника объединяются с данными элемента назначения. Платформа Sync Framework указывает действие по устранению конфликтов Merge.

ApplicationDefined

Объект применения изменений извещает приложение синхронизации о каждом конфликте совпадения по мере его возникновения с использованием события ItemConstraint. Приложение проверяет конфликтующие изменения и указывает действие по устранению конфликтов путем вызова метода SetResolutionAction.

Политика устранения конфликтов совпадения для неуправляемого кода

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

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

CCRP_SOURCE_PROVIDER_WINS

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

CCRP_DESTINATION_PROVIDER_WINS

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

CCRP_RENAME_SOURCE

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

CCRP_RENAME_DESTINATION

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

CCRP_MERGE

Данные из элемента источника объединяются с данными элемента назначения. Платформа Sync Framework указывает действие по устранению конфликтов SCRA_MERGE.

CCRP_NONE

Объект применения изменений извещает приложение синхронизации о каждом конфликте совпадения по мере его возникновения с использованием события ISyncConstraintCallback::OnConstraintConflict. Приложение проверяет конфликтующие элементы и задает действие для устранения конфликтов вызовом метода IConstraintConflict::SetConstraintResolveActionForChange или IConstraintConflict::GetConstraintResolveActionForChangeUnit.

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

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

Задание пользовательского устранения конфликтов с помощью управляемого кода

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

  • Регистрирует обработчик события ItemConstraint поставщика назначения.

  • Присваивает свойству CollisionConflictResolutionPolicy поставщика назначения значение ApplicationDefined.

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

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

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

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

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

SourceWins

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

Только конфликты совпадения.

DestinationWins

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

Только конфликты совпадения.

RenameSource

Изменение, отправленное поставщиком источника, переименовывается, чтобы устранить конфликт с элементом реплики назначения, а изменение источника применяется на реплике назначения. Объект применения изменений передает изменение методу SaveItemChange и указывает действие сохранения RenameSourceAndUpdateVersionAndData.

Только конфликты совпадения.

RenameDestination

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

Только конфликты совпадения.

Merge

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

Только конфликты совпадения.

SaveConflict

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

Все конфликты ограничений.

SkipChange

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

Все конфликты ограничений.

Определение пользовательского устранения конфликтов с помощью неуправляемого кода

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

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

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

Метод OnConstraintConflict получает объект IConstraintConflict, содержащий метаданные и данные элемента для двух конфликтующих изменений. Этот метод может исследовать два конфликтующих изменения, внести изменения в метаданные и данные элемента и задать действие по разрешению конфликта вызовом метода IConstraintConflict::SetConstraintResolveActionForChange или IConstraintConflict::GetConstraintResolveActionForChangeUnit. Объект применения изменений обрабатывает конфликт и выполняет диспетчеризацию вызова целевому объекту применения изменений. Следует помнить, что для устранения конфликтов ограничения могут быть использованы только методы SCRA_TRANSFER_AND_DEFER и SCRA_DEFER.

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

Политика устранения конфликтов Описание Допустимые типы содержимого

SCRA_ACCEPT_SOURCE_PROVIDER

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

Только конфликты совпадения.

SCRA_ACCEPT_DESTINATION_PROVIDER

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

Только конфликты совпадения.

SCRA_RENAME_SOURCE

Изменение, отправленное поставщиком источника, переименовывается, чтобы устранить конфликт с элементом реплики назначения, а изменение источника применяется на реплике назначения. Объект применения изменений передает изменение методу SaveChange и указывает действие сохранения SSA_RENAME_SOURCE_AND_UPDATE_VERSION_AND_DATA.

Только конфликты совпадения.

SCRA_RENAME_DESTINATION

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

Только конфликты совпадения.

SCRA_MERGE

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

Только конфликты совпадения.

SCRA_TRANSFER_AND_DEFER

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

Все конфликты ограничений.

SCRA_DEFER

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

Все конфликты ограничений.

Слияние конфликтующих элементов

Слияние двух элементов при возникновении конфликта совпадения ограничения отличается от слияния элементов, участвующих в конфликте параллелизма, поскольку элементы, участвующие в конфликте совпадения, имеют разные идентификаторы. Например, в реплике создан файл с именем FavoriteBooks.txt, которому присвоен идентификатор id1. В другой реплике также создан файл FavoriteBooks.txt, получивший идентификатор id2. При синхронизации реплик с помощью Sync Framework эти два элемента рассматриваются как разные, поскольку имеют разные идентификаторы элементов, однако в реплике назначения они трактуются как один и тот же элемент, поскольку имеют одинаковое имя. Поэтому поставщик назначения сообщает о конфликте совпадения и указывает, что должно быть выполнено слияние содержимого этих двух элементов. Объект применения изменений назначает объединенному элементу идентификатор id1 и указывает, что реплика назначения должна сохранить отметку полного удаления слиянием для идентификатора id2.

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

Управляемый код Если действием по разрешению изменения является Merge, то объект применения изменений вызывает метод SaveItemChange и указывает действие по сохранению ChangeIdUpdateVersionAndMergeData. Объект применения изменений передает изменение с идентификатором проигравшего элемента в параметре change. Изменение с идентификатором выигравшего элемента может быть получено путем вызова метода GetWinnerChange объекта SaveChangeContext, переданного параметром context.

Неуправляемый код Если действием по разрешению изменения является SCRA_MERGE, то объект применения изменений вызывает метод ISynchronousNotifyingChangeApplierTarget::SaveChange и указывает действие по сохранению SSA_CHANGE_ID_UPDATE_VERSION_AND_MERGE_DATA. Объект применения изменений передает изменение с идентификатором проигравшего элемента в параметре pChange. Изменение с идентификатором выигравшего элемента может быть получено вызовом метода ISaveChangeContext2::GetWinnerChange объекта ISaveChangeContext2, переданного параметром pSaveContext.

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

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

    1. Если значение id2 больше значения id3, то поставщик создает и сохраняет две отметки полного удаления слиянием. Одна отметка полного удаления содержит id1 в качестве идентификатора проигравшего элемента и id2 в качестве идентификатора выигравшего элемента. Другая отметка полного удаления содержит id2 в качестве идентификатора проигравшего элемента и id3 в качестве идентификатора выигравшего элемента. Эта вторая отметка полного удаления может уже существовать, и в таком случае ее нужно оставить без изменений. Таким образом создается цепь отметок полного удаления путем слияния в порядке убывания идентификаторов элементов.

    2. Если значение id3 больше значения id2, то поставщик возвращает ошибку.

  2. Подвергнуть слиянию данные для элемента в реплике назначения с данными для элемента из поставщика источника. Элемент назначения может быть идентифицирован по id1 или по id2.

  3. Применить метаданные об изменении к метаданным назначения и к объединенным данным для изменения в хранилище элемента назначения с использованием идентификатора выигравшего элемента, id2, в качестве идентификатора элемента для изменения, подвергнутого слиянию. Метаданные для изменения могут быть получены путем вызова метода GetWinnerChange объекта context (для управляемого кода) или метода GetWinnerChange объекта pContext (для неуправляемого кода).

Распространение объединенного элемента

Распространение объединенных элементов, полученных путем слияния после возникновения конфликта совпадения ограничения, выполняется не так, как распространение элементов, объединенных при разрешении конфликта параллелизма, поскольку такой конфликт может возникнуть с идентификатором выигравшего элемента, идентификатором проигравшего элемента или с обоими. Например, реплика X содержит элемент с идентификатором id1, который был получен путем слияния из элементов с идентификаторами id1 и id2. Реплика Y содержит элемент с идентификатором id2 и в ней сделаны локальные изменения элемента. Если объединенный элемент с идентификатором id1 отправляется с реплики X на реплику Y, то возникает конфликт по причине того, что id1 теперь ссылается на тот же элемент, что и id2.

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

Объект применения изменений также обнаруживает несовпадение идентификатора элемента в реплике источника и реплике назначения. Например, реплика X разрешает конфликт совпадения между элементами с идентификаторами id1 и id2 путем объединения элементов и присваивания идентификатора id1 объединенному элементу. Реплика Y разрешает конфликт совпадения между элементами с идентификаторами id1 и id2 путем переименования элемента с идентификатором id1, и сохранения обоих элементов. Реплика X передает объединенный элемент с идентификатором id1, и отметку полного удаления слиянием, которая указывает, что произошло слияние элемента id2 с элементом id1. Конфликт с элементом id1, обнаруживается и разрешается как конфликт параллелизма. Конфликт с элементом id2 обнаруживается и передается приложению синхронизации как конфликт идентификаторов с указанием причины конфликта Identity (для управляемого кода) или CCR_IDENTITY (для неуправляемого кода). Приложение определяет, следует ли разрешить конфликт путем сохранения изменения в источнике или в назначении.

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

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

Действие по сохранению Действия поставщика

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

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

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

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

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

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

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

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

NoteПримечание.

Все действия по сохранению должны быть применены как элементарные.

См. также

Справочник

Интерфейс ISaveChangeContext2
Интерфейс ISaveChangeWithChangeUnitsContext2
Интерфейс ISynchronousNotifyingChangeApplier2
Интерфейс ISynchronousNotifyingChangeApplierTarget2
SaveChangeContext
SaveChangeWithChangeUnitsContext
NotifyingChangeApplier
INotifyingChangeApplierTarget2

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

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