동시성 충돌 검색 및 해결
동시성 충돌은 나중에 동기화되는 두 복제본에서 같은 항목 또는 변경 단위가 변경될 때 발생합니다. Sync Framework에서는 동시성 충돌을 간단하게 검색하고 해결할 수 있는 변경 내용 적용자 개체를 제공합니다.
변경 내용 적용자에서 동시성 충돌을 검색하고 해결하는 방법
동시성 충돌은 대상 복제본의 변경 내용 버전이 원본 복제본의 정보에 들어 있지 않을 때 검색됩니다.
Sync Framework에서는 대상 공급자가 동시성 충돌을 검색하는 데 사용할 수 있는 변경 내용 적용자 개체를 제공합니다. 변경 내용 적용자는 원본 공급자가 전송한 변경 내용 일괄 처리의 각 항목에 대해 다음 단계를 수행하여 동시성 충돌을 검색합니다.
항목의 대상 복제본 버전이 원본 복제본의 정보에 들어 있는지 확인합니다.
항목에 대한 대상 복제본의 버전이 원본 복제본의 정보에 들어 있지 않으면 변경 내용이 충돌합니다.
변경 내용 적용자가 동시성 충돌을 검색한 후 세션에 설정된 충돌 해결 정책 또는 지정된 충돌에 대해 응용 프로그램에서 설정한 충돌 해결 동작에 따라 충돌을 해결합니다.
변경 내용 적용자를 사용하여 동시성 충돌 검색
변경 내용 적용자를 사용하여 변경 내용을 검색하려면 대상 공급자에서 우선 변경 내용 적용자 개체를 만듭니다.
관리 코드 NotifyingChangeApplier 개체를 만듭니다.
비관리 코드 IID_ISynchronousNotifyingChangeApplier를 IProviderSyncServices::CreateChangeApplier 메서드에 전달하여 ISynchronousNotifyingChangeApplier 개체를 만듭니다.
그 다음에 원본 공급자가 전송한 변경 내용 일괄 처리의 각 항목에 대한 버전 정보를 대상 공급자가 제공해야 합니다. 다음과 같은 두 가지 방법으로 이를 수행할 수 있습니다.
대상 공급자에서 원본 공급자가 전송한 변경 내용 일괄 처리에 해당하는 버전 목록을 작성합니다. 변경 내용 적용자는 이 목록을 사용하여 항목의 대상 버전이 원본 복제본의 정보에 들어 있는지 확인합니다.
관리 코드 이 목록을 만들려면 System.Collections.Generic.IEnumerable<Microsoft.Synchronization.ItemChange> 형식의 개체를 만듭니다. 원본 공급자의 변경 내용 일괄 처리에 있는 각 항목에 대해 항목의 대상 복제본 버전이 포함된 이 목록에 항목을 추가합니다. ApplyChanges 같이 이 목록을 적합한 메서드 오버로드의 destinationVersions 매개 변수로 변경 내용 적용자에 전달합니다.
비관리 코드 이 목록을 만들려면 IProviderSyncServices::CreateDestinationChangeVersionsBuilder를 호출하여 IDestinationChangeVersionsBuilder 개체를 만듭니다. 원본 공급자의 변경 내용 일괄 처리에 있는 각 항목에 대해 IDestinationChangeVersionsBuilder::AddItemMetadata를 호출하여 항목의 대상 복제본 버전이 포함된 이 목록에 항목을 추가합니다. IDestinationChangeVersionsBuilder::GetChangeEnumerator를 호출하여 목록의 열거자를 가져와 ApplyChanges 메서드의 pDestinationVersions 매개 변수로 변경 내용 적용자에 전달합니다.
또는 대상 공급자에서 대상 버전 목록을 변경 내용 적용자에 전달하는 대신 TryGetDestinationVersion(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplierTarget::GetDestinationVersion(비관리 코드의 경우) 메서드를 구현합니다. 변경 내용 적용자는 원본 공급자의 변경 내용 일괄 처리에 있는 각 항목에 대해 이 메서드를 한 번씩 호출합니다. 이 메서드에서는 대상 공급자가 항목의 대상 복제본 버전을 찾아 변경 내용 적용자에게 반환합니다. 그러면 변경 내용 적용자가 변경 내용이 충돌하는지 여부를 확인할 수 있습니다.
마지막으로 대상 공급자가 변경 내용 적용자의 ApplyChanges(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplier::ApplyChanges(비관리 코드의 경우) 메서드를 호출합니다.
변경 내용 적용자를 사용하여 동시성 충돌 해결
변경 내용 적용자는 공급자에서 지정된 변경 내용 적용자 대상 개체에 호출을 디스패치하여 대상 공급자가 충돌을 해결하도록 도와 줍니다. 충돌 해결 정책이 지정되어 있으면 변경 내용 적용자가 이를 사용하여 발생한 각 충돌을 해결하는 데 사용할 수 있는 올바른 충돌 해결 동작을 결정합니다. 사용자 지정 충돌 해결이 지정되어 있으면 변경 내용 적용자가 동기화 응용 프로그램에 충돌을 알리고 응용 프로그램에서 충돌 해결 동작을 지정합니다. 모든 경우에 변경 내용 적용자가 적절한 변경 내용 적용자 대상 메서드를 호출하고 변경 내용 적용자 대상 개체가 변경 내용을 복제본에 저장하거나 나중에 처리할 수 있도록 충돌을 로깅하는 등의 동작을 수행합니다.
동기화 응용 프로그램에서는 일반적으로 동기화가 시작되기 전에 동시성 충돌 해결 정책을 지정합니다.
관리 코드 응용 프로그램에서 대상 공급자의 ConflictResolutionPolicy 속성을 원하는 값으로 설정하여 정책을 지정합니다.
비관리 코드 응용 프로그램에서 ISyncSession::Start 메서드의 resolutionPolicy 매개 변수에 정책을 지정합니다. 대상 공급자는 이 정책을 IKnowledgeSyncProvider::ProcessChangeBatch 메서드의 resolutionPolicy 매개 변수로 수신합니다.
대상 공급자는 변경 내용 적용자가 변경 내용 적용자 대상에 대한 메서드를 적절하게 디스패치할 수 있도록 충돌 해결 정책을 변경 내용 적용자에 전달합니다. 변경 내용 적용자 대상은 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 이벤트에 대한 이벤트 처리기를 등록합니다.
대상 공급자의 ConflictResolutionPolicy 속성을 ApplicationDefined로 설정합니다.
비관리 코드
ISyncCallback::OnConflict 메서드를 구현하고 ISyncSession::RegisterCallback을 호출하여 ISyncCallback 개체를 등록합니다.
CRP_NONE을 ISyncSession::Start의 resolutionPolicy 매개 변수로 전달합니다.
동기화 중에 변경 내용 적용자는 검색되는 각 동시성 충돌마다 한 번씩 ItemConflicting 이벤트(관리 코드의 경우) 또는 ISyncCallback::OnConflict 메서드(비관리 코드의 경우)를 발생시킵니다. 응용 프로그램에서는 충돌의 두 변경 내용을 검사하고 메타데이터나 항목 데이터를 변경한 다음 SetResolutionAction 메서드(관리 코드의 경우) 또는 IChangeConflict::SetResolveActionForChange 또는 IChangeConflict::SetResolveActionForChangeUnit 메서드(비관리 코드의 경우)를 사용하여 충돌 해결 동작을 설정할 수 있습니다. 그런 다음 변경 내용 적용자가 충돌을 처리하고 변경 내용 적용자 대상 개체에 대한 적절한 호출을 디스패치합니다.
참고
항목에서 모든 충돌하는 변경 단위에 동일한 충돌 해결 동작을 지정해야 합니다. 그렇지 않으면 예기치 않은 결과가 발생할 수 있습니다. 이 유형의 충돌 해결이 필요한 경우 병합을 통해 충돌을 해결하고 대상 공급자에서 해결을 처리하도록 지정합니다.
관리 코드에서 사용되는 동시성 충돌 해결 동작
Sync Framework에서는 변경 내용 적용자가 대부분의 처리를 담당하는 다음과 같은 동시성 충돌 해결 동작 집합을 제공합니다.
충돌 해결 동작 | 설명 |
---|---|
SourceWins |
원본 복제본의 변경 내용이 우선 적용됩니다. 변경 내용 적용자는 변경 내용을 SaveItemChange 또는 SaveChangeWithChangeUnits 메서드에 전달하고 저장 동작을 UpdateVersionAndData로 지정합니다. 충돌하지 않은 모든 변경 내용과 마찬가지로 변경 내용이 대상 복제본에 적용됩니다. |
DestinationWins |
대상 복제본의 변경 내용이 우선 적용됩니다. 변경 내용 적용자는 버전 전용 변경 내용을 SaveItemChange 또는 SaveChangeWithChangeUnits 메서드에 전달하고 저장 동작을 UpdateVersionOnly로 지정합니다. 항목의 버전 정보만 대상 복제본의 메타데이터에서 업데이트됩니다. 항목 데이터는 변경되지 않습니다. |
원본 항목의 데이터를 대상 항목에 병합합니다. 변경 내용 적용자는 원본 복제본의 변경 내용 데이터를 SaveItemChange 또는 SaveChangeWithChangeUnits 메서드에 전달하고 저장 동작을 UpdateVersionAndMergeData로 지정합니다. 대상 공급자가 원본 항목 데이터와 대상 항목 데이터를 결합하고 그 결과를 대상 복제본에 적용합니다. |
|
충돌을 기록하고 변경 내용을 적용하지 않습니다. 변경 내용 적용자는 충돌 데이터를 SaveConflict 메서드에 전달하여 충돌 로그에 충돌을 저장합니다. 충돌 기록에 대한 자세한 내용은 충돌 기록 및 관리를 참조하십시오. |
|
충돌을 무시하고 변경 내용을 적용하지 않습니다. 변경 내용 적용자는 충돌 데이터를 대상 공급자에 전달하지 않습니다. |
|
마지막 기록자 우선 |
최근 변경 내용이 우선 적용됩니다. 응용 프로그램에서 두 변경 내용에 대해 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로 지정합니다. |
참고 항목
참조
ISynchronousNotifyingChangeApplier 인터페이스
ISynchronousNotifyingChangeApplierTarget 인터페이스
CONFLICT_RESOLUTION_POLICY 열거형
SYNC_RESOLVE_ACTION 열거형
NotifyingChangeApplier
INotifyingChangeApplierTarget
ConflictResolutionAction
ConflictResolutionPolicy