Registrar y administrar conflictos

Durante la sincronización, una aplicación de sincronización puede indicar que un conflicto se debe guardar en un registro de conflictos, en lugar de resolverse inmediatamente. El uso de un registro de conflictos permite que estos puedan resolverse posteriormente con independencia de la sincronización, para que la sincronización pueda completarse con la mayor eficacia posible.

Resolver un conflicto registrándolo

Para indicar que un conflicto de simultaneidad se va a guardar, la aplicación establece una acción para la resolución de conflictos de SaveConflict (en código administrado) o SRA_TRANSFER_AND_DEFER (en código no administrado). Para indicar que un conflicto de restricción se va a guardar, la aplicación establece una acción para la resolución de conflictos de SaveConflict (en código administrado) o SCRA_TRANSFER_AND_DEFER (en código no administrado).

Registrar un conflicto

Para registrar un conflicto de simultaneidad, el aplicador de cambios llama a SaveConflict (en código administrado) o a ISynchronousNotifyingChangeApplierTarget::SaveConflict (en código no administrado). En este método, el proveedor guarda los metadatos del cambio en conflicto, los datos del cambio en conflicto y el conocimiento del conflicto especificado.

Para registrar un conflicto de restricción, el aplicador de cambios llama a SaveConstraintConflict (en código administrado) o a ISynchronousNotifyingChangeApplierTarget2::SaveConstraintConflict (en código no administrado). En este método, el proveedor guarda los metadatos del cambio en conflicto, los datos del cambio en conflicto, el identificador del elemento en conflicto en la réplica de destino, el motivo del conflicto y el conocimiento del conflicto especificado.

Antes de que un conflicto se almacene en el registro de conflictos, el proveedor debe asegurarse de que el conflicto no se reemplace por otro cambio ya existente en el registro de conflictos. Una forma de lograr esto es crear un conocimiento del registro utilizando el método Combine (en código administrado) o el método ISyncKnowledge::Union (en código no administrado) para combinar el conocimiento del conflicto de todos los conflictos en el registro. Si el nuevo conflicto está contenido en el conocimiento del registro, está obsoleto y no se debe agregar al registro. Este conocimiento del registro puede crearse a petición o puede estar almacenado junto con el registro de conflictos. Si el conocimiento del registro está almacenado, debe actualizarse cuando se agrega un conflicto, utilizando Combine (en código administrado) o Union (en código no administrado). De igual forma, cuando se quita un conflicto, el conocimiento del registro debe actualizarse utilizando Complement (en código administrado) o ISyncKnowledge2::Complement (en código no administrado).

Quitar los conflictos obsoletos

Para que el tamaño del registro de conflictos no sea demasiado grande, deben quitarse de él los conflictos obsoletos.

La detección y eliminación de conflictos obsoletos se logran más fácilmente utilizando el componente aplicador de cambios de Sync Framework. Para conectar un registro de conflictos con el aplicador de cambios, el proveedor o el registro de conflictos implementa las interfaces IConflictLogAccess e IConflictLogWriter (en código administrado) o las interfaces IConflictLogAccess e IConflictLogWriter (en código no administrado). El registro de conflictos se pasa al aplicador de cambios utilizando el método

ApplyChanges (en código administrado) o el método ISynchronousNotifyingChangeApplier2::ApplyChanges (en código no administrado). Cuando un registro de conflictos se pasa al aplicador de cambios, este último detecta y quita los conflictos obsoletos que están en el registro al final de cada lote de cambios.

En el caso de un registro de conflictos que no se conecta con un aplicador de cambios, el registro de conflictos debe administrar los conflictos obsoletos por sí mismo. Un conflicto puede volverse obsoleto cuando un conflicto se agrega al registro de conflictos que reemplaza un conflicto que está en el registro. Una forma de detectar este caso es probar la versión de cambio de cada conflicto en el registro frente al conocimiento del conflicto del nuevo conflicto. Cuando la versión de cambio de un conflicto está contenida en el conocimiento del conflicto del nuevo conflicto, el conflicto existente queda obsoleto y se debe quitar del registro. Un conflicto también puede volverse obsoleto cuando un cambio se aplica a la réplica que reemplaza un conflicto que está en el registro. Una forma de detectar este caso es probar la versión de cambio de cada conflicto en el registro frente al conocimiento de la réplica después de aplicarse cada lote de cambios. La detección y resolución de conflictos obsoletos se pueden realizar como parte de la sesión de sincronización o en otro momento.

Resolver los conflictos del registro

Los conflictos del registro de conflictos se pueden resolver como parte de la sesión de sincronización o en otro momento. Sin embargo, los conflictos del registro de conflictos no se deben resolver durante la aplicación de cambios porque pueden producirse resultados inesperados.

Cuando un conflicto del registro se aplica a la réplica, se debe tratar como un cambio local. Para resolver un conflicto del registro de conflictos, la aplicación o el proveedor realiza los pasos siguientes:

  1. Incrementa el contador de la réplica.

  2. Actualiza la versión de cambio del elemento o unidad de cambio para reflejar que el cambio lo realiza la réplica local con el contador actualizado.

  3. Combina el conocimiento de la réplica con el conocimiento del conflicto utilizando Combine (en código administrado) o Union (en código no administrado) y guarda el conocimiento combinado como nuevo conocimiento de la réplica.

  4. Aplica los datos del cambio a la réplica.

  5. Quita el conflicto del registro de conflictos.

Registro de conflictos en memoria

Se requiere un registro de conflictos cuando un proveedor notifica conflictos de restricción. Para ayudar a un proveedor que notifica conflictos de restricción en una réplica que no contiene un registro de conflictos, Sync Framework proporciona una implementación de las interfaces del registro de conflictos que opera en memoria y se utiliza para almacenar los conflictos temporales que pueden surgir como resultado del control de conflictos de restricción. La implementación es la clase MemoryConflictLog (en código administrado) o la interfaz IMemoryConflictLog, que puede obtenerse llamando a IProviderSyncServices2::CreateMemoryConflictLog (en código no administrado).

La implementación del registro de conflictos en memoria también se puede utilizar junto con un registro de conflictos persistente. El registro de conflictos en memoria permite conseguir una mejora del rendimiento si se utiliza para proporcionar una caché en memoria del registro completo de conflictos y administrar los conflictos temporales. Cuando un registro de conflictos persistente está encadenado al registro de conflictos en memoria, los conflictos se pueden guardar en el registro de conflictos persistente después de completarse la sincronización llamando a Persist (en código administrado) o a IMemoryConflictLog::Persist (en código no administrado).

Vea también

Conceptos

Controlar los conflictos