Freigeben über


Protokollieren und Verwalten von Konflikten

Während der Synchronisierung wird möglicherweise von einer Synchronisierungsanwendung angezeigt, dass ein Konflikt in einem Konfliktprotokoll gespeichert werden muss, statt sofort aufgelöst werden zu können. Durch die Verwendung eines Konfliktprotokolls können Konflikte später unabhängig von der Synchronisierung aufgelöst werden, und die Synchronisierung kann so effizient wie möglich abgeschlossen werden.

Auflösen von Konflikten durch Protokollierung

Um anzuzeigen, dass ein Parallelitätskonflikt gespeichert werden muss, legt die Anwendung eine Konfliktauflösungsaktion von SaveConflict (für verwalteten Code) oder SRA_TRANSFER_AND_DEFER (für nicht verwalteten Code) fest. Um anzuzeigen, dass ein Einschränkungskonflikt gespeichert werden muss, legt die Anwendung eine Konfliktauflösungsaktion von SaveConflict (für verwalteten Code) oder SCRA_TRANSFER_AND_DEFER (für nicht verwalteten Code) fest.

Protokollieren eines Konflikts

Um einen Parallelitätskonflikt zu protokollieren, ruft der Änderungsanwender SaveConflict (für verwalteten Code) oder ISynchronousNotifyingChangeApplierTarget::SaveConflict (für nicht verwalteten Code) auf. Bei dieser Methode speichert der Anbieter die Metadaten und Daten der Änderung, die den Konflikt verursacht, sowie das angegebene Konfliktwissen.

Um einen Einschränkungskonflikt zu protokollieren, ruft der Änderungsanwender SaveConstraintConflict (für verwalteten Code) oder ISynchronousNotifyingChangeApplierTarget2::SaveConstraintConflict (für nicht verwalteten Code) auf. Bei dieser Methode speichert der Anbieter die Metadaten und Daten der Änderung, die den Konflikt verursacht, die ID des den Konflikt verursachenden Elements im Zielreplikat, den Grund für den Konflikt und das angegebene Konfliktwissen.

Bevor ein Konflikt im Konfliktprotokoll gespeichert wird, muss der Anbieter sicherstellen, dass der Konflikt nicht durch eine andere Änderung außer Kraft gesetzt wird, der sich bereits im Konfliktprotokoll befindet. Eine Möglichkeit, dies zu erreichen, ist die Erstellung eines Protokollwissens mithilfe der Combine-Methode (für verwalteten Code) oder der ISyncKnowledge::Union-Methode (für nicht verwalteten Code), um das Konfliktwissen aller Konflikte im Protokoll zusammenzufassen. Wenn der neue Konflikt im Protokollwissen enthalten ist, ist dieser veraltet und sollte dem Protokoll nicht hinzugefügt werden. Dieses Protokollwissen kann bei Bedarf erstellt oder zusammen mit dem Konfliktprotokoll gespeichert werden. Wenn das Protokollwissen gespeichert wird, muss es bei Hinzufügen eines Konflikts mithilfe von Combine (für verwalteten Code) oder von Union (für nicht verwalteten Code) aktualisiert werden. Entsprechend muss das Protokollwissen bei der Entfernung eines Konflikts mithilfe von Complement (für verwalteten Code) oder von ISyncKnowledge2::Complement (für nicht verwalteten Code) aktualisiert werden.

Entfernen veralteter Konflikte

Damit das Konfliktprotokoll nicht zu umfangreich wird, müssen veraltete Konflikte daraus entfernt werden.

Das Erkennen und Entfernen veralteter Konflikte kann am einfachsten mithilfe der Änderungsanwenderkomponente von Sync Framework durchgeführt werden. Um ein Konfliktprotokoll mit dem Änderungsanwender zu verbinden, implementiert der Anbieter oder das Konfliktprotokoll die Schnittstellen IConflictLogAccess und IConflictLogWriter (für verwalteten Code) bzw. IConflictLogAccess und IConflictLogWriter (für nicht verwalteten Code). Das Konfliktprotokoll wird mit der

ApplyChanges-Methode (für verwalteten Code) oder mit der ISynchronousNotifyingChangeApplier2::ApplyChanges-Methode (für nicht verwalteten Code) an den Änderungsanwender übergeben. Wenn ein Konfliktprotokoll an den Änderungsanwender übergeben wird, erkennt und entfernt dieser am Ende jedes Änderungsbatchs die veralteten Konflikte im Protokoll.

Ein Konfliktprotokoll, das nicht mit einem Änderungsanwender verbunden ist, muss veraltete Konflikte selbst verwalten. Ein veralteter Konflikt kann entstehen, wenn dem Konfliktprotokoll ein Konflikt hinzugefügt wird, der einen bereits im Protokoll vorhandenen Konflikt ersetzt. Eine Möglichkeit, diesen Fall zu erkennen, besteht darin, die Änderungsversion aller Konflikte im Protokoll mit dem Konfliktwissen des neuen Konflikts abzugleichen. Wenn die Änderungsversion eines Konflikts im Konfliktwissen des neuen Konflikts enthalten ist, ist der vorhandene Konflikt veraltet und muss aus dem Protokoll entfernt werden. Ein veralteter Konflikt kann auch entstehen, wenn im Replikat eine Änderung angewendet wird, die einen bereits im Protokoll vorhandenen Konflikt ersetzt. Eine Möglichkeit, diesen Fall zu erkennen, besteht darin, nach der Anwendung der einzelnen Änderungsbatches die Änderungsversion aller Konflikte im Protokoll mit dem Wissen des Replikats abzugleichen. Das Erkennen und Auflösen von veralteten Konflikten kann entweder während der Synchronisierungssitzung oder zu einer anderen Zeit ausgeführt werden.

Auflösen von Konflikten im Protokoll

Konflikte im Konfliktprotokoll können entweder während der Synchronisierungssitzung oder zu einer anderen Zeit aufgelöst werden. Konflikte im Konfliktprotokoll sollten nicht während der Änderungsanwendung aufgelöst werden, da andernfalls unerwartete Ergebnisse auftreten können.

Wenn ein Konflikt im Protokoll auf das Replikat angewendet wird, muss er als lokale Änderung behandelt werden. Um einen Konflikt im Konfliktprotokoll aufzulösen, führt die Anwendung oder der Anbieter folgende Schritte aus:

  1. Erhöhen der Taktanzahl des Replikats.

  2. Aktualisieren der Änderungsversion des Elements oder der Änderungseinheit, um zu berücksichtigen, dass die Änderung vom lokalen Replikat mit der aktualisierten Taktanzahl vorgenommen wird.

  3. Kombinieren des Replikatwissens mit dem Konfliktwissen durch Verwenden von Combine (für verwalteten Code) oder von Union (für nicht verwalteten Code) und Speichern des kombinierten Wissens als neues Wissen des Replikats.

  4. Anwenden der Änderungsdaten auf das Replikat.

  5. Entfernen des Konflikts aus dem Konfliktprotokoll.

Konfliktprotokoll im Arbeitsspeicher

Ein Konfliktprotokoll ist erforderlich, wenn ein Anbieter Einschränkungskonflikte meldet. Zur Unterstützung von Anbietern, die Einschränkungskonflikte für ein Replikat melden, das kein Konfliktprotokoll enthält, stellt Sync Framework eine Implementierung der Konfliktprotokoll-Schnittstellen bereit, die im Arbeitsspeicher ausgeführt wird, um temporäre Konflikte zu speichern, die möglicherweise bei der Behandlung von Einschränkungskonflikten entstehen. Die Implementierung ist die MemoryConflictLog-Klasse (für verwalteten Code) oder die IMemoryConflictLog-Schnittstelle, die durch Aufrufen von IProviderSyncServices2::CreateMemoryConflictLog abgerufen werden kann (für nicht verwalteten Code).

Die Implementierung des Konfliktprotokolls im Arbeitsspeicher kann auch in Verbindung mit einem permanenten Konfliktprotokoll verwendet werden. Mit dem Konfliktprotokoll im Arbeitsspeicher können Leistungssteigerungen erzielt werden, wenn es verwendet wird, um einen speicherresidenten Cache des gesamten Konfliktprotokolls bereitzustellen und temporäre Konflikte zu behandeln. Wenn ein permanentes Konfliktprotokoll mit dem Konfliktprotokoll im Arbeitsspeicher verkettet ist, können Konflikte nach Abschluss der Synchronisierung im permanenten Konfliktprotokoll gespeichert werden, indem Persist (für verwalteten Code) oder IMemoryConflictLog::Persist (für nicht verwalteten Code) aufgerufen wird.

Siehe auch

Konzepte

Konfliktbehandlung