다음을 통해 공유


충돌 기록 및 관리

동기화하는 동안 동기화 응용 프로그램은 충돌을 즉시 해결하는 대신 충돌 로그에 저장하도록 지시할 수 있습니다. 충돌 로그를 사용하면 충돌을 동기화와 별도로 해결할 수 있으므로 동기화를 최대한 효율적으로 완료할 수 있습니다.

기록에 의한 충돌 해결

동시성 충돌을 저장하도록 지시하려면 응용 프로그램에서 SaveConflict(관리 코드의 경우) 또는 SRA_TRANSFER_AND_DEFER(비관리 코드의 경우)의 충돌 해결 동작을 설정합니다. 제약 조건 충돌을 저장하도록 지시하려면 응용 프로그램에서 SaveConflict(관리 코드의 경우) 또는 SCRA_TRANSFER_AND_DEFER(비관리 코드의 경우)의 충돌 해결 동작을 설정합니다.

충돌 기록

동시성 충돌을 기록하기 위해 변경 내용 적용자는 SaveConflict(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplierTarget::SaveConflict(비관리 코드의 경우)를 호출합니다. 이 메서드에서 공급자는 충돌하는 변경 내용의 메타데이터, 충돌하는 변경 내용의 데이터 및 지정된 충돌 정보를 저장합니다.

제약 조건 충돌을 기록하기 위해 변경 내용 적용자는 SaveConstraintConflict(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplierTarget2::SaveConstraintConflict(비관리 코드의 경우)를 호출합니다. 이 메서드에서 공급자는 충돌하는 변경 내용의 메타데이터, 충돌하는 변경 내용의 데이터, 대상 복제본의 충돌하는 항목 ID, 충돌의 원인 및 지정된 충돌 정보를 저장합니다.

충돌을 충돌 로그에 저장하기 전에 공급자는 충돌 로그에 이미 있는 다른 변경 내용이 이 충돌을 대체하지 않는지 확인해야 합니다. 이렇게 하는 한 가지 방법은 Combine 메서드(관리 코드의 경우) 또는 ISyncKnowledge::Union 메서드(비관리 코드의 경우)를 통해 로그에 있는 모든 충돌의 충돌 정보를 결합하여 로그 정보를 만드는 것입니다. 새 충돌이 로그 정보에 포함되어 있으면 이 충돌은 더 이상 사용되지 않으며 로그에 추가되지 않아야 합니다. 이 로그 정보는 필요에 따라 만들거나 충돌 로그와 함께 저장할 수 있습니다. 로그 정보가 저장되면 충돌이 추가될 때 Combine(관리 코드의 경우) 또는 Union(비관리 코드의 경우)을 사용하여 로그 정보를 업데이트해야 합니다. 마찬가지로 충돌이 제거되면 Complement(관리 코드의 경우) 또는 ISyncKnowledge2::Complement(비관리 코드의 경우)를 사용하여 로그 정보를 업데이트해야 합니다.

사용되지 않는 충돌 제거

충돌 로그가 너무 커지지 않도록 충돌 로그에서 사용되지 않는 충돌을 제거해야 합니다.

사용되지 않는 충돌의 검색 및 제거는 Sync Framework의 변경 내용 적용자 구성 요소를 사용하여 손쉽게 수행할 수 있습니다. 충돌 로그를 변경 내용 적용자에 연결할 수 있도록 공급자 또는 충돌 로그는 IConflictLogAccessIConflictLogWriter 인터페이스(관리 코드의 경우) 또는 IConflictLogAccessIConflictLogWriter 인터페이스(비관리 코드의 경우)를 구현합니다. 충돌 로그는 다음을 사용하여 변경 내용 적용자에 전달됩니다.

ApplyChanges 메서드(관리 코드의 경우) 또는 ISynchronousNotifyingChangeApplier2::ApplyChanges 메서드(비관리 코드의 경우). 충돌 로그가 변경 내용 적용자에 전달되면 변경 내용 적용자는 각 변경 내용 일괄 처리가 끝날 때 로그에 있는 사용되지 않는 충돌을 검색하고 제거합니다.

변경 내용 적용자에 연결되어 있지 않은 충돌 로그는 사용되지 않는 충돌을 자체적으로 관리해야 합니다. 로그에 있는 충돌을 대체하는 충돌이 충돌 로그에 추가되면 충돌이 더 이상 사용되지 않게 될 수 있습니다. 이러한 경우를 검색하는 한 가지 방법은 로그에 있는 각 충돌의 변경 버전을 새 충돌의 충돌 정보에 대해 테스트하는 것입니다. 충돌의 변경 버전이 새 충돌의 충돌 정보에 포함되어 있으면 기존 충돌은 더 이상 사용되지 않으므로 로그에서 제거해야 합니다. 로그에 있는 충돌을 대체하는 변경 내용이 복제본에 적용되는 경우에도 충돌이 더 이상 사용되지 않게 될 수 있습니다. 이러한 경우를 검색하는 한 가지 방법은 로그에 있는 각 충돌의 변경 버전을 각 변경 내용 일괄 처리를 적용한 후 복제본의 정보에 대해 테스트하는 것입니다. 사용되지 않는 충돌의 검색 및 해결은 동기화 세션의 일환으로 수행되거나 다른 시간에 수행될 수 있습니다.

로그에 있는 충돌 해결

충돌 로그의 충돌은 동기화 세션의 일환으로 해결되거나 다른 시간에 해결될 수 있습니다. 하지만 충돌 로그의 충돌은 변경 내용 적용 중에 해결되지 않아야 합니다. 그렇지 않으면 예기치 않은 결과가 발생할 수 있습니다.

로그에 있는 충돌이 복제본에 적용되는 경우 이 충돌은 로컬 변경 내용으로 처리되어야 합니다. 충돌 로그에 있는 충돌을 해결하기 위해 응용 프로그램 또는 공급자는 다음 단계를 수행합니다.

  1. 복제본의 틱 수를 늘립니다.

  2. 틱 수가 업데이트된 로컬 복제본에 의해 변경이 수행됨을 반영하도록 항목 또는 변경 단위의 변경 버전을 업데이트합니다.

  3. Combine(관리 코드의 경우) 또는 Union(비관리 코드의 경우)을 사용하여 복제본의 정보와 충돌의 정보를 결합한 다음 이를 복제본의 새 정보로 저장합니다.

  4. 변경 내용 데이터를 복제본에 적용합니다.

  5. 충돌 로그에서 충돌을 제거합니다.

메모리 내 충돌 로그

공급자가 제약 조건 충돌을 보고하는 경우 충돌 로그가 있어야 합니다. 충돌 로그가 포함되지 않은 복제본에 대해 제약 조건 충돌을 보고하는 공급자를 돕기 위해 Sync Framework에서는 메모리 내에서 작동하고 제약 조건 충돌 처리 결과 발생할 수 있는 임시 충돌을 저장하는 데 사용되는 충돌 로그 인터페이스 구현을 제공합니다. 이 구현은 MemoryConflictLog 클래스(관리 코드의 경우) 또는 IProviderSyncServices2::CreateMemoryConflictLog 호출을 통해 얻을 수 있는 IMemoryConflictLog 인터페이스(비관리 코드의 경우)입니다.

메모리 내 충돌 로그 구현을 영구적인 충돌 로그와 연결하여 사용할 수도 있습니다. 메모리 내 충돌 로그를 사용하여 전체 충돌 로그의 메모리 내 캐시를 제공하고 임시 충돌을 처리함으로써 성능을 향상시킬 수도 있습니다. 영구적인 충돌 로그가 메모리 내 충돌 로그에 연결되면 Persist(관리 코드의 경우) 또는 IMemoryConflictLog::Persist(비관리 코드의 경우)를 호출하여 동기화가 완료된 후 충돌을 영구적인 충돌 로그에 저장할 수 있습니다.

참고 항목

개념

충돌 처리