Suscripciones actualizables: resolución de conflictos de actualización en cola

Se aplica a:SQL Server

Como las suscripciones de actualización en cola permiten realizar modificaciones en los mismos datos en múltiples ubicaciones, pueden producirse conflictos cuando se sincronizan los datos en el publicador. La replicación detecta los conflictos cuando se sincronizan los cambios con el publicador y resuelve esos conflictos utilizando la directiva de resolución que ha seleccionado al crear la publicación. Pueden producirse los siguientes conflictos:

  • Conflictos al actualizar y al insertar. Este conflicto se produce cuando los mismos datos se modifican en dos ubicaciones. Una de las modificaciones "gana", mientras que la otra "pierde".

  • Eliminar conflictos. Este conflicto se produce cuando se elimina la misma fila en una ubicación y se modifica en la otra.

La detección y resolución de conflictos puede consumir mucho tiempo y muchos recursos y, por tanto, es mejor minimizar los conflictos de la aplicación creando particiones de datos de forma que los distintos suscriptores modifiquen distintos subconjuntos de datos.

Detectar conflictos

Al crear una publicación y habilitar la actualización en cola, la replicación agrega una columna uniqueidentifier (msrepl_tran_version) con el valor predeterminado de newid() a la tabla subyacente. Cuando se modifican los datos publicados en el publicador o el suscriptor, la fila recibe un identificador único global (GUID) para indicar que existe una nueva versión de la fila. El Agente de lectura de cola utiliza esta columna durante la sincronización para determinar si existe un conflicto.

Una transacción en una cola mantiene los valores de las versiones antigua y nueva de la fila. Cuando la transacción se aplica en el publicador, se comparan los GUID de la transacción y el GUID de la publicación. Si el GUID anterior almacenado en la transacción coincide con el GUID de la publicación, la publicación se actualiza y a la fila se le asigna el nuevo GUID generado por el suscriptor. Al actualizar la publicación con el GUID de la transacción, se obtienen versiones de fila correspondientes tanto en la publicación como en la transacción.

Si el GUID antiguo almacenado en la transacción no coincide con el de la publicación, se detectará un conflicto. El nuevo GUID de la publicación indica que existen dos versiones diferentes de la fila: una en la transacción enviada por el suscriptor y otra más reciente que existe en el publicador. En este caso, otro suscriptor o publicador actualizó la misma fila en la publicación antes de la sincronización de esta transacción de suscriptor.

A diferencia de la replicación de mezcla, una columna GUID no se utiliza para identificar la fila en sí, sino para comprobar si la fila ha cambiado.

Solucionar conflictos

Al crear una publicación con la actualización en cola, se selecciona un solucionador de conflictos que se utilizará si se detectan conflictos. El solucionador de conflictos rige la forma en que el Agente de lectura de cola controla diferentes versiones de la misma fila que se encuentran durante la sincronización. Puede modificar la directiva de resolución de conflictos después de crear la publicación, con tal de que no haya suscripciones a la publicación. Las opciones del solucionador de conflictos son las siguientes:

  • El publicador gana (valor predeterminado)

  • El publicador gana y se reinicializa la suscripción

  • El suscriptor gana

Los conflictos se registran y se pueden ver con el Visor de conflictos.

Establecer la política de resolución de conflictos de actualización en cola

Para ver conflictos de datos

El publicador gana

Cuando la resolución de conflictos se establece en El publicador gana, se mantiene la coherencia transaccional en función de los datos del publicador. La transacción en conflicto se revierte en el suscriptor que la inició.

El agente lector de cola detecta un conflicto y se generan comandos de compensación, que se propagan al Suscriptor publicándolos en la base de datos de distribución. A continuación, el Agente de distribución aplica los comandos de compensación al suscriptor que originó la transacción en conflicto. Las acciones de compensación actualizan las filas del Suscriptor para que coincidan con las del Publicador.

Hasta que se apliquen los comandos de compensación será posible leer los resultados de una transacción que finalmente se revertirá en el suscriptor. Esto equivale a una lectura sucia (nivel de aislamiento de lectura no confirmada). No habrá compensación para las siguientes transacciones dependientes que puedan producirse. Sin embargo, se garantizan los límites de la transacción y todas las acciones de una transacción se confirman o, en caso de conflicto, se revierten.

El publicador gana y se reinicializa la suscripción

Reinicializar el suscriptor para resolver conflictos mantiene una estricta coherencia transaccional en el suscriptor, pero puede llevar mucho tiempo si la publicación contiene grandes cantidades de datos.

Cuando el agente lector de cola detecta un conflicto, se rechazan todas las transacciones restantes de la cola (incluida la transacción en conflicto) y se marca al Suscriptor para reinicializarlo. El Agente de distribución aplica al suscriptor la siguiente instantánea generada para la publicación.

El suscriptor gana

La detección de conflictos con la directiva «gana el Suscriptor» significa que la última transacción del Suscriptor que actualiza al Publicador es la que prevalece. En este caso, cuando se detecte un conflicto, se seguirá utilizando la transacción enviada por el suscriptor y se actualizará el publicador. Esta directiva es apropiada para las aplicaciones en que estos cambios no pongan en peligro la integridad de los datos.