다음을 통해 공유


제약 조건 충돌 검색 및 해결

제약 조건 충돌은 파일 시스템 내에서 폴더의 관계 또는 이름이 같은 데이터의 위치 등 항목에 적용되는 제약 조건을 위반하는 충돌입니다. Sync Framework에서는 제약 조건 충돌을 간단하게 해결할 수 있는 변경 내용 적용자 개체를 제공합니다.

제약 조건 충돌은 대상 공급자에서 동기화의 변경 내용 적용 단계 중에 검색됩니다. 대상 공급자가 제약 조건 충돌을 검색하면 변경 내용 적용자에 해당 충돌을 보고합니다. 변경 내용 적용자는 세션에 설정된 충돌 해결 정책 또는 지정된 충돌에 대해 응용 프로그램에서 설정한 충돌 해결 동작에 따라 충돌을 해결합니다. 그런 다음 변경 내용 적용자는 대상 공급자가 해결된 충돌을 대상 복제본에 적용할 수 있도록 대상 공급자에 필요한 호출을 디스패치합니다.

공급자가 제약 조건 충돌을 보고하고 변경 내용 적용자를 사용할 때 변경 내용 적용자가 충돌을 처리하고 기록하는 데 사용하는 충돌 로그도 제공해야 합니다. Sync Framework에서는 자체 충돌 로그가 구현되지 않은 공급자에 대해 충돌 로그의 메모리 내 구현을 제공합니다. 자세한 내용은 충돌 기록 및 관리를 참조하십시오.

제약 조건 충돌은 사용자 지정 필터 또는 변경 적용 서비스를 사용하는 공급자가 사용할 수 없으며, 그렇지 않을 경우 예상치 못한 결과가 발생할 수 있습니다.

제약 조건 충돌의 유형

제약 조건 충돌은 대상 복제본에서 사용되는 데이터 저장소에 따라 다르므로 형식이 다양합니다. Sync Framework에서는 제약 조건 충돌을 다음과 같은 세 가지 유형으로 구분합니다.

  • 예를 들어 대상 복제본에 이미 있는 파일과 이름 및 위치가 같은 파일을 원본 공급자가 보내는 경우처럼 대상 저장소에 있는 다른 항목과 충돌하여 항목을 저장할 수 없는 경우 중복 충돌이 발생합니다.

  • 원본 공급자가 파일을 대상 복제본에 없는 디렉터리에 저장하도록 보내는 경우처럼 항목에 필요한 부모 항목이 없어서 계층 구조 데이터 저장소에 해당 항목을 저장할 수 없는 경우 손실된 부모 충돌이 발생합니다.

  • 다른 제약 조건 충돌은 원본 공급자가 보내는 파일이 너무 커서 대상 복제본에 저장할 수 없는 경우 또는 변경 내용이 대상 복제본의 일부 비즈니스 논리를 위반하는 경우와 같이 저장할 항목이 대상 복제본의 제약 조건을 위반하는 경우 발생합니다. 비즈니스 논리 충돌의 예로 두 개의 변경 단위 name 및 country를 저장하는 정확성 낮은 복제본과 세 개의 변경 단위 name, state/province 및 country를 저장하는 정확성 높은 복제본이 있다고 가정합니다. 정확성 높은 복제본에는 country 필드에 대해 state/province 필드를 검사하는 비즈니스 논리가 포함되어 있고 검사를 통과하지 못하는 변경 내용은 저장되지 않습니다. 정확성 낮은 복제본은 원본으로 사용되며 country가 "USA"로 설정된 항목을 보냅니다. 대상 공급자가 변경 내용을 정확성 높은 복제본에 적용하려고 시도하지만 정확성 높은 복제본에서는 항목의 state/province 필드에 "British Columbia"가 포함되어 있습니다. 따라서 변경 내용이 비즈니스 논리를 위반하므로 제약 조건 충돌이 발생합니다.

대상 공급자는 다음 값 중에서 선택하여 제약 조건 충돌의 원인을 지정합니다.

제약 조건 충돌의 원인 설명

Collision(관리 코드의 경우), CCR_COLLISION(비관리 코드의 경우)

기존 항목과 이름이 같은 항목의 경우와 같이 저장소의 다른 항목과 충돌하여 항목을 저장할 수 없습니다. 공급자는 대상 항목의 ID를 충돌 항목 ID로 지정해야 합니다.

NoParent(관리 코드의 경우), CCR_NOPARENT(비관리 코드의 경우)

항목에 필요한 부모 항목이 저장소에 없으므로 해당 항목을 계층적 데이터 저장소에 저장할 수 없습니다. 필요에 따라 공급자는 없는 부모 항목의 ID를 충돌 항목 ID로 지정할 수 있습니다.

Other(관리 코드의 경우), CCR_OTHER(비관리 코드의 경우)

항목 또는 변경 단위가 대상 복제본의 다른 제약 조건을 위반합니다. 필요에 따라 공급자는 충돌 항목의 ID를 충돌 항목 ID로 지정할 수 있습니다.

제약 조건 충돌 검색 및 보고

제약 조건 충돌 검색은 복제본에서 사용되는 데이터 저장소에 따라 다릅니다. 따라서 제약 조건 충돌은 대상 공급자에서 검색해야 합니다. 예를 들어 계층적 파일 시스템을 나타내는 공급자는 유지되는 데이터에 적용되는 저장소별 제약 조건(예: 위치, 이름, 크기 등)을 검색할 수 있어야 합니다.

제약 조건 충돌은 대상 공급자에서 동기화의 변경 내용 적용 단계 중에 검색됩니다.

관리 코드 일반적으로 제약 조건 충돌이 대상 공급자의 SaveItemChange 또는 SaveChangeWithChangeUnits 메서드에서 검색되고 RecordConstraintConflictForItem 또는 RecordConstraintConflictForChangeUnit을 호출하여 보고됩니다.

비관리 코드 일반적으로 제약 조건 충돌이 대상 공급자의 ISynchronousNotifyingChangeApplierTarget::SaveChange 또는 ISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits 메서드에서 검색되고 ISaveChangeContext2::SetConstraintConflictOnChange 또는 ISaveChangeWithChangeUnitsContext2::SetConstraintConflictOnChangeUnit을 호출하여 보고됩니다.

변경 내용 적용자에서 제약 조건 충돌에 대한 보고를 받으면 몇 가지 조치를 취합니다.

  • 제약 조건 충돌이 중복 충돌이면 변경 내용 적용자가 충돌이 새 충돌, 임시 충돌 또는 병합 해결 전파인지 확인합니다. 충돌을 처리하는 동안 변경 내용 적용자가 SaveConstraintConflict(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplierTarget2::SaveConstraintConflict(비관리 코드의 경우)를 호출하여 충돌 로그에 임시로 충돌을 저장할 수 있습니다. 동기화 세션이 끝나면 변경 내용 적용자가 로그에서 임시 충돌을 제거합니다.

  • 세션에 설정된 중복 충돌 해결 정책 또는 응용 프로그램에서 결정한 충돌 해결 동작에 따라 충돌을 해결합니다. 중복 충돌 해결 정책이 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 메서드를 사용하여 충돌 해결 동작을 설정할 수 있습니다. 그런 다음 변경 내용 적용자가 충돌을 처리하고 변경 내용 적용자 대상 개체에 대한 적절한 호출을 디스패치합니다. 제약 조건 충돌이 중복 충돌이 아니면 올바른 충돌 해결 동작은 SaveConflictSkipChange뿐이라는 점에 유의하십시오.

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_DEFERSCRA_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

충돌을 무시하고 변경 내용을 적용하지 않습니다. 변경 내용 적용자는 충돌 데이터를 대상 공급자에 전달하지 않습니다.

모든 제약 조건 충돌

충돌 항목 병합

중복 충돌과 관련된 두 항목은 항목 ID가 서로 다르므로 중복 제약 조건 충돌의 두 항목을 병합하는 작업은 동시성 충돌의 항목을 병합하는 작업과 다릅니다. 예를 들어 한 복제본에 이름이 "FavoriteBooks.txt"이고 항목 ID가 id1인 파일이 만들어지고 다른 복제본에 이름이 "FavoriteBooks.txt"이고 항목 ID가 id2인 파일이 또 만들어지면 두 복제본이 동기화될 때 Sync Framework에서는 이러한 항목을 항목 ID가 다르므로 다른 항목으로 간주하지만 대상 복제본에서는 이러한 항목을 이름이 같으므로 같은 항목으로 간주합니다. 따라서 대상 공급자가 중복 충돌을 보고하고 병합해야 하는 두 항목의 내용을 지정합니다. 변경 내용 적용자는 병합된 항목에 id1의 ID를 할당하고 대상 복제본에서 id2의 병합 삭제 표식을 저장하도록 지정합니다.

병합으로 중복 충돌이 해결되면 항목 ID 중 하나를 병합된 항목에 할당된 적용 항목 ID로 선택하고 무시 항목 ID가 병합되었는지 적절하게 추적해야 합니다. 변경 내용 적용자는 두 항목 ID를 비교하고 보다 작은 ID를 적용 ID로 선택하여 적용 항목 ID를 선택합니다. 적용 항목 ID는 대상 복제본에서 병합된 항목을 식별하는 데 사용됩니다. 병합 삭제 표식이 만들어지고 대상 복제본에 저장됩니다. 병합 삭제 표식은 동기화 커뮤니티에서 무시 항목 ID가 적용 항목 ID와 동일한 항목을 식별하는지 추적합니다. 병합 삭제 표식의 메타데이터는 삭제된 항목 삭제 표식의 메타데이터에 적용 항목 ID가 추가된 것과 같습니다.

관리 코드 변경 내용 해결 동작이 Merge이면 변경 내용 적용자가 SaveItemChange를 호출하고 ChangeIdUpdateVersionAndMergeData의 저장 동작을 지정합니다. 변경 내용 적용자는 무시 항목 ID를 change 매개 변수로 지정하여 변경 내용을 전달합니다. 적용 항목 ID가 있는 변경 내용은 context 매개 변수에서 전달된 SaveChangeContext 개체의 GetWinnerChange 메서드를 호출하여 얻을 수 있습니다.

비관리 코드 변경 내용 해결 동작이 SCRA_MERGE이면 변경 내용 적용자가 ISynchronousNotifyingChangeApplierTarget::SaveChange를 호출하고 SSA_CHANGE_ID_UPDATE_VERSION_AND_MERGE_DATA의 저장 동작을 지정합니다. 변경 내용 적용자는 무시 항목 ID를 pChange 매개 변수로 지정하여 변경 내용을 전달합니다. 적용 항목 ID가 있는 변경 내용은 pSaveContext 매개 변수에서 전달된 ISaveChangeContext2 개체의 ISaveChangeContext2::GetWinnerChange 메서드를 호출하여 얻을 수 있습니다.

대상 공급자는 몇 가지 단계를 수행하여 병합 동작을 적절하게 처리해야 합니다. id1을 무시 항목 ID로, id2를 적용 항목 ID로 지정하는 병합 동작을 가정해 봅니다. 대상 공급자는 한 트랜잭션에서 다음과 같은 단계를 수행해야 합니다.

  1. 병합 삭제 표식을 대상 메타데이터에 저장합니다. 병합 삭제 표식에는 id1이 무시 항목 ID로, id2가 적용 항목 ID로 포함되어 있습니다. id1을 무시 항목 ID로 포함하고 다른 항목 ID인 id3를 적용 항목 ID로 포함하는 병합 삭제 표식이 대상 복제본에 이미 있으면 공급자가 다음 단계를 수행합니다.

    1. id2가 id3보다 크면 공급자가 두 병합 삭제 표식을 만들고 저장합니다. 한 병합 삭제 표식에는 id1이 무시 항목 ID로, id2가 적용 항목 ID로 포함되어 있습니다. 다른 병합 삭제 표식에는 id2가 무시 항목 ID로, id3이 적용 항목 ID로 포함되어 있습니다. 이 두 번째 병합 삭제 표식은 이미 있을 수 있으며, 이미 있는 경우 따로 유지됩니다. 이 경우 병합 삭제 표식의 체인이 항목 ID 기준의 내림차순으로 만들어집니다.

    2. id3이 id2보다 크면 공급자가 오류를 반환합니다.

  2. 대상 복제본의 항목 데이터를 원본 복제본의 항목 데이터와 병합합니다. 대상 항목은 id1 또는 id2로 식별할 수 있습니다.

  3. 적용 항목 ID인 id2를 병합된 변경 내용의 항목 ID로 사용하여 변경 내용의 메타데이터를 대상 메타데이터에 적용하고 변경 내용의 병합된 데이터를 대상 항목 저장소에 적용합니다. 변경 내용의 메타데이터는 context의 GetWinnerChange 메서드(관리 코드의 경우) 또는 pContext의 GetWinnerChange 메서드(비관리 코드의 경우)를 호출하여 얻을 수 있습니다.

병합된 항목 전파

충돌은 적용 항목 ID, 무시 항목 ID 또는 둘 모두에서 발생할 수 있으므로 중복 제약 조건 충돌의 병합된 항목을 전파하는 작업은 동시성 충돌의 병합된 항목을 전파하는 작업과 다릅니다. 예를 들어 복제본 X에 ID가 id1인 항목과 id2인 항목에서 병합된 ID가 id1인 항목이 포함되어 있고, 복제본 Y에 ID가 id2인 항목이 포함되어 있는데 항목이 로컬로 변경되었으면 id1로 식별되는 병합된 항목을 복제본 X에서 복제본 Y로 보낼 때 id1이 현재 id2와 같은 항목을 가리키므로 충돌이 발생합니다.

변경 내용 적용자는 적용 항목 ID와 무시 항목 ID가 모두 발생하는 동시성 충돌을 검색하고 병합된 항목 변경 내용을 대상 복제본에 적용하기 위해 대상 공급자가 수행해야 하는 올바른 동작을 결정하여 대상 공급자가 병합된 항목 변경 내용을 적용하도록 돕습니다. 대상 공급자가 병합된 항목 변경 내용을 적용할 때 제약 조건 충돌을 검색하면 다른 제약 조건 충돌과 같이 제약 조건 충돌을 보고해야 합니다.

변경 내용 적용자는 원본 복제본과 대상 복제본의 항목 ID가 일치하지 않는 경우도 검색합니다. 예를 들어 복제본 X는 ID가 각각 id1과 id2인 항목을 병합한 후 병합된 항목에 id1을 할당하여 두 항목 간의 중복 충돌을 해결합니다. 반면에 복제본 Y는 ID가 각각 id1과 id2인 항목에 대해 id1로 식별된 항목의 이름을 바꾸고 두 항목을 모두 유지하여 항목 간의 중복 충돌을 해결합니다. 복제본 X는 id1로 식별되는 병합된 항목과 id2가 id1에 병합되었음을 나타내는 병합 삭제 표식을 보냅니다. 이제 id1에서 충돌이 검색된 후 동시성 충돌로 해결되고, id2에서 충돌이 검색된 후 충돌 원인을 Identity(관리 코드의 경우) 또는 CCR_IDENTITY(비관리 코드의 경우)로 지정하여 동기화 응용 프로그램에 ID 충돌로 보고됩니다. 그러면 응용 프로그램에서 충돌을 해결할 때 원본 변경 내용을 유지할지 아니면 대상 변경 내용을 유지할지를 결정합니다.

원본 공급자가 변경 단위 필터링을 사용하고 대상 공급자가 필터링되지 않으면 해당 항목이 병합 삭제 표식에 의해 대상 복제본에서 제거할 항목으로 식별되는 경우에도 가끔 ID 충돌이 발생할 수 있습니다. 이는 변경 적용자에서 필터링된 정보를 처리하는 방식 때문입니다. 병합 삭제 표식이 올바르게 동기화되고 전파되도록 하려면 대상 공급자에서 병합 삭제 표식을 유지하고 대상 복제본에서 충돌하는 항목을 제거해야 합니다.

원본 공급자가 병합된 항목 변경 내용을 전송하면 대상 공급자가 대상 복제본에 변경 내용을 적용하기 위해 수행해야 하는 올바른 동작을 변경 내용 적용자가 결정합니다. 다음 표에서는 변경 내용자가 지정할 수 있는 저장 동작과 변경 내용을 적용하기 위해 공급자가 수행해야 하는 동작을 보여 줍니다.

저장 동작 공급자 동작

ChangeIdUpdateVersionAndSaveData(관리 코드의 경우), SSA_CHANGE_ID_UPDATE_VERSION_AND_SAVE_DATA(비관리 코드의 경우)

위의 충돌 항목 병합에서 설명한 단계를 따라 무시 항목 ID의 병합 삭제 표식을 저장합니다. 적용 항목 변경 내용을 적용합니다.

ChangeIdUpdateVersionOnly(관리 코드의 경우), SSA_CHANGE_ID_UPDATE_VERSION_ONLY(비관리 코드의 경우)

위의 충돌 항목 병합에서 설명한 단계를 따라 무시 항목 ID의 병합 삭제 표식을 저장합니다. 적용 항목 변경 내용의 메타데이터만 적용합니다.

ChangeIdUpdateVersionAndDeleteAndStoreTombstone(관리 코드의 경우), SSA_CHANGE_ID_UPDATE_VERSION_AND_DELETE_AND_STORE_TOMBSTONE(비관리 코드의 경우)

위의 충돌 항목 병합에서 설명한 단계를 따라 무시 항목 ID의 병합 삭제 표식을 저장합니다. 적용 항목 ID로 식별되는 항목을 삭제하고 해당 삭제 표식을 저장합니다.

StoreMergeTombstone(관리 코드의 경우), SSA_STORE_MERGE_TOMBSTONE(비관리 코드의 경우)

위의 충돌 항목 병합에서 설명한 단계를 따라 무시 항목 ID의 병합 삭제 표식을 저장합니다.

참고

저장 동작의 모든 단계는 원자성 동작으로 적용되어야 합니다.

참고 항목

참조

ISaveChangeContext2 인터페이스
ISaveChangeWithChangeUnitsContext2 인터페이스
ISynchronousNotifyingChangeApplier2 인터페이스
ISynchronousNotifyingChangeApplierTarget2 인터페이스
SaveChangeContext
SaveChangeWithChangeUnitsContext
NotifyingChangeApplier
INotifyingChangeApplierTarget2

개념

충돌 처리
동시성 충돌 검색 및 해결