충돌 처리
동기화 도중 대상 공급자는 ProcessChangeBatch(관리 코드의 경우) 또는 ProcessChangeBatch(비관리 코드의 경우) 메서드를 통해 원본 공급자에서 일괄 변경 내용을 수신합니다. 그런 다음 대상 공급자는 이 목록으로 인해 발생하는 모든 충돌을 검색하여 처리해야 합니다.
충돌 검색
동기화에서는 동시성 충돌과 제약 조건 충돌이라는 두 가지 범주의 충돌이 발생할 수 있습니다.
동시성 충돌
동시성 충돌은 대상 복제본의 변경 내용 버전이 원본 복제본의 정보에 들어 있지 않을 때 발생합니다. 이러한 충돌이 발생하는 원인은 업데이트-삭제 및 업데이트-업데이트 등의 작업이 동기화되는 같은 항목에 영향을 주기 때문입니다.
일반적으로 대상 공급자는 Sync Framework에서 제공하는 변경 내용 적용자 개체를 사용하여 동시성 충돌을 검색합니다. 변경 내용 적용자는 NotifyingChangeApplier 개체(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplier 인터페이스(비관리 코드의 경우)로 나타냅니다. 변경 내용 적용자를 사용하여 변경 내용을 검색하려면 대상 공급자는 원본 공급자에서 전송한 일괄 변경 내용에 있는 각 항목에 대한 버전 정보를 제공해야 합니다. 다음과 같은 두 가지 방법으로 이를 수행할 수 있습니다.
대상 공급자에서 원본 공급자가 전송한 일괄 변경 내용에 해당하는 변경 내용 목록을 작성합니다. 원본 공급자의 일괄 변경 내용에 있는 각 항목에 대해 대상 공급자는 대상 복제본에 있는 해당 항목의 버전이 들어 있는 목록에 항목을 추가합니다. 이 목록을 변경 내용 적용자에 전달합니다. 변경 내용 적용자는 이 목록을 사용하여 각 항목의 대상 버전이 원본 복제본의 정보에 들어 있는지 확인합니다.
대상 공급자에서 대상 버전 목록을 변경 내용 적용자에 제공하는 대신 TryGetDestinationVersion(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplierTarget::GetDestinationVersion(비관리 코드의 경우) 메서드를 구현합니다. 원본 공급자의 일괄 변경 내용에 있는 각 항목에 대해 이 메서드를 한 번씩 호출합니다.
변경 내용 적용자가 충돌을 검색하는 방법을 쉽게 이해할 수 있도록 대상 공급자가 원본 공급자에서 일괄 변경 내용을 수신하는 시나리오를 가정해 봅니다. 충돌을 검색하기 위해 일괄 변경 내용의 각 항목에 대해 다음과 같은 단계가 수행합니다.
대상 공급자에서 항목의 대상 복제본 버전이 원본 복제본의 정보에 들어 있는지 확인합니다.
대상 복제본의 버전이 원본 복제본의 정보에 들어 있지 않으면 개체가 충돌 상태로 판단됩니다.
제약 조건 충돌
제약 조건 충돌은 항목에 적용되는 제약 조건(예: 파일 시스템 내에서 폴더의 관계 또는 이름이 같은 데이터의 위치 등)을 위반하는 충돌입니다.
제약 조건 충돌을 검색할 때는 복제본에서 사용하는 데이터 저장소를 고려해야 하므로 이러한 충돌 유형은 공급자에서 검색해야 합니다. 예를 들어 계층적 파일 시스템을 나타내는 공급자는 유지되는 데이터에 적용되는 저장소별 제약 조건(예: 위치, 이름, 크기 등)을 검색할 수 있어야 합니다.
충돌 해결
세션 도중 발생하는 모든 충돌에 적용되는 충돌 해결 정책을 정의하거나 각 충돌에 대해 한 번씩 발생하는 이벤트를 처리하여 충돌을 해결할 수 있습니다.
충돌 해결 정책 설정
세션 도중 발생하는 모든 충돌에 적용되는 정책을 지정하려면 응용 프로그램에서 대상 공급자의 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(비관리 코드의 경우) 메서드에 전달합니다. |
항목 작업 전용 |
지연 |
충돌을 무시하고 변경 내용을 적용하지 않습니다. 변경 내용 적용자는 충돌하는 변경 내용을 대상 공급자에 전달하지 않습니다. |
항목 작업 전용 |
저장된 충돌
충돌이 기록되면 SaveItemChange(관리 코드의 경우) 또는 SaveChange(비관리 코드의 경우) 메서드 대신 SaveConflict(관리 코드의 경우) 또는 SaveConflict(비관리 코드의 경우) 메서드가 호출됩니다. 이러한 경우 공급자는 충돌 정보, 충돌하는 변경 내용 및 충돌 데이터를 저장해야 합니다. 그런 다음 응용 프로그램에서 충돌 로그를 통해 이러한 충돌을 열거하고 이후에 해결할 수 있습니다. 이러한 유형의 충돌 해결은 항상 로컬에서 수행되는 변경 내용입니다. 따라서 충돌을 해결하는 응용 프로그램은 충돌을 로컬 변경 내용으로 적용하고 틱 수를 업데이트한 다음 충돌 정보를 로컬 정보에 추가해야 합니다.
또한 저장된 충돌을 해결하는 응용 프로그램에서는 사용되지 않는 충돌을 처리해야 합니다. 특히 공급자는 새 충돌을 기록할 때 정보와 새 충돌을 비교하여 기록되는 충돌이 해당 항목에 대해 이전에 기록된 충돌을 대체하는지 확인해야 합니다. 사용되지 않는 충돌도 로그에서 정리해야 합니다. 공급자 대신 응용 프로그램에서 사용되지 않는 충돌을 비동기적으로 정리할 수 있습니다. 이러한 경우 응용 프로그램은 충돌을 해결하기 전에 해당 충돌이 실제로 사용되는지 확인해야 합니다.
변경 단위를 사용하여 충돌 줄이기
하위 항목 변경 내용을 나타내는 변경 단위를 사용하면 충돌 횟수를 줄일 수 있습니다. 변경 단위를 사용하면 전체 항목이 아닌 변경 단위의 버전이 추적됩니다. 따라서 같은 항목 내에서 서로 다른 변경 단위를 변경해도 충돌이 발생하지 않습니다. 자세한 내용은 변경 단위 동기화를 참조하십시오.
참고 항목
참조
ISyncKnowledge 인터페이스
ISyncProvider 인터페이스
IKnowledgeSyncProvider 인터페이스
IKnowledgeSyncProvider::ProcessChangeBatch
ISynchronousNotifyingChangeApplierTarget 인터페이스
IAsynchronousNotifyingChangeApplierTarget 인터페이스
ISyncCallback::OnConflict
CONFLICT_RESOLUTION_POLICY 열거형
SYNC_RESOLVE_ACTION 열거형
SyncKnowledge
KnowledgeSyncProvider
INotifyingChangeApplierTarget
ItemConflicting
ConflictResolutionPolicy
ConflictResolutionAction