Conflicto de replicación de mezcla avanzada: resolución en un registro lógico

Se aplica a:SQL Server

En este tema se tratan las diferentes combinaciones de opciones de detección y resolución de conflictos posibles al utilizar registros lógicos. Los conflictos en la replicación de mezcla se producen cuando más de un nodo cambia los mismos datos o, al replicar cambios, la replicación de mezcla encuentra determinados tipos de errores, por ejemplo una infracción de restricción. Para obtener más información acerca de la detección y resolución de conflictos, vea Advanced Merge Replication Conflict Detection and Resolution.

Para especificar el seguimiento de conflictos y el nivel de resolución de un artículo, consulte Modify Merge Replication options.

Detección de conflictos

Dos propiedades de artículo determinan la manera en que se detectan conflictos para los registros lógicos: column_tracking y logical_record_level_conflict_detection. SQL Server 2005 (9.x) y las versiones posteriores también admiten la detección de nivel de registro lógico.

La propiedad del artículo logical_record_level_conflict_detection puede establecerse en TRUE o FALSE. El valor solo debe establecerse para el artículo principal de nivel superior y los artículos secundarios lo ignorarán. Si este valor es FALSE, la replicación de mezcla detecta los conflictos del mismo modo que en versiones anteriores de SQL Server, basándose únicamente en el valor de la propiedad column_tracking del artículo. Si el valor es TRUE, la replicación de mezcla omitirá la propiedad column_tracking del artículo y detectará un conflicto si se realizan cambios en cualquier lugar del registro lógico. Por ejemplo, considere este escenario:

Tres registros lógicos de tabla con valores

Un conflicto se detecta si dos usuarios cambian cualquier valor del registro lógico Customer2 en las tablas Customers, Ordersu OrderItems . Este ejemplo incluye cambios realizados mediante una instrucción UPDATE, pero el conflicto también puede detectarse por cambios realizados con instrucciones INSERT o DELETE.

Resolución de conflictos

De forma predeterminada, la replicación de mezcla utiliza una lógica basada en prioridades para resolver conflictos. Si se realiza un cambio conflictivo en dos bases de datos de suscriptor, gana el cambio para el suscriptor con la prioridad de suscripción más alta. O bien, si la prioridad es la misma, gana el primer cambio que llegue al publicador. Con la detección a nivel de fila y de columna, toda la fila ganadora siempre sobrescribe la fila perdedora.

La propiedad del artículo logical_record_level_conflict_resolution puede configurarse como TRUE o FALSE. El valor solo debe establecerse para el artículo principal de nivel superior, y los artículos secundarios lo ignorarán. Si el valor es TRUE, todo el registro lógico ganador sobrescribe el registro lógico perdedor. Si es FALSE, cada fila ganadora puede provenir de diferentes Suscriptores o Publicadores. Por ejemplo, el suscriptor A puede ganar un conflicto en una fila de la tabla Orders , y el suscriptor B puede ganar en una fila relacionada de la tabla OrderItems . El resultado es un registro lógico con la fila Orders del suscriptor A y la fila OrderItems del suscriptor B.

Interacción de la configuración de resolución y detección de conflictos

El resultado de los conflictos depende de la interacción entre la configuración de detección de conflictos y la de resolución. En los siguientes ejemplos se supone que se ha utilizado la resolución de conflictos basada en prioridad. Al utilizar registros lógicos, las posibilidades son:

  • Detección a nivel de fila o columna, resolución a nivel de fila

  • Detección a nivel de columna, resolución de registros lógicos

  • Detección a nivel de fila, resolución de registros lógicos

  • Detección de registros lógicos, resolución de registros lógicos

Detección a nivel de fila o columna, resolución a nivel de fila

En este ejemplo, la publicación se ha configurado de la siguiente manera:

  • column_tracking es TRUE o FALSE

  • logical_record_level_conflict_detection es FALSE

  • logical_record_level_conflict_resolution es FALSE

En este caso, la detección se produce en el nivel de fila o columna, y la resolución tiene lugar en el nivel de fila. Esta configuración se utiliza para aprovechar que todos los cambios de un registro lógico se repliquen como una unidad, pero sin detección ni resolución de conflictos en el nivel de registro lógico.

Detección a nivel de columna, resolución de registros lógicos

En este ejemplo, la publicación se ha configurado de la siguiente manera:

  • column_tracking está establecido en TRUE

  • logical_record_level_conflict_detection es FALSE

  • logical_record_level_conflict_resolution está establecido en TRUE

Un publicador y un suscriptor empiezan con el mismo conjunto de datos y se define un registro lógico entre las tablas orders y customers . El publicador cambia la columna custcol1 en la tabla customers y la columna ordercol1 en la tabla orders . El suscriptor cambia custcol1 en la misma fila de la tabla customers y la columna ordercol2 en la misma fila de la tabla orders. Los cambios en la misma columna de la tabla customer dan como resultado un conflicto, pero los cambios de la tabla orders no están en conflicto.

Debido a que los conflictos se resuelven a nivel de registro lógico, los cambios que prevalecen realizados en el Publicador sustituyen los cambios realizados en las tablas del Suscriptor durante el proceso de replicación.

Primera serie de tablas en las que se muestran cambios en filas relacionadas.

Detección a nivel de fila, Resolución de registros lógicos

En este ejemplo, la publicación se ha configurado de la siguiente manera:

  • column_tracking es FALSE

  • logical_record_level_conflict_detection es FALSE

  • logical_record_level_conflict_resolution es VERDADERO

Un publicador y un suscriptor empiezan con el mismo conjunto de datos. El publicador cambia la columna custcol1 en la tabla customers . El suscriptor cambia la columna custcol2 en la tabla customers y la columna ordercol2 en la tabla orders . Los cambios en la misma fila de la tabla customers provocan un conflicto, pero los cambios del Suscriptor en la tabla orders no entran en conflicto.

Debido a que los conflictos se resuelven en el nivel de registro lógico, durante la sincronización los cambios ganadores realizados en el publicador reemplazan los cambios realizados en las tablas del suscriptor.

Segunda serie de tablas en las que se muestran cambios en filas relacionadas.

Detección de registros lógicos, resolución de registros lógicos

En este ejemplo, la publicación se ha configurado de la siguiente manera:

  • logical_record_level_conflict_detection es TRUE

  • logical_record_level_conflict_resolution está establecido en TRUE

Un publicador y un suscriptor empiezan con el mismo conjunto de datos. El publicador cambia la columna custcol1 en la tabla customers . El suscriptor cambia la columna ordercol1 en la tabla orders. No hay cambios en la misma fila o columna, pero como los cambios se han realizado en el mismo registro lógico para custid=1, los cambios se detectan como un conflicto de nivel de registro lógico.

Puesto que los conflictos también se resuelven en el nivel de registro lógico, durante la sincronización los cambios ganadores realizados en el publicador reemplazan los cambios realizados en las tablas del suscriptor.

Tercera serie de tablas en las que se muestran cambios en filas relacionadas.