Detección de conflictos en la replicación punto a punto

La replicación transaccional punto a punto permite insertar, actualizar o eliminar datos en cualquier nodo de una topología y propagar los cambios de los datos a los demás nodos. Dado que se pueden cambiar los datos de cualquier nodo, podrían producirse conflictos entre los datos modificados en los distintos nodos. Si una fila se modifica en más de un nodo, puede producirse un conflicto o incluso la pérdida de una actualización cuando la fila se propaga a otros nodos.

La replicación punto a punto de SQL Server 2008 presenta la opción de habilitar la detección de conflictos en una topología punto a punto. Esta opción contribuye a evitar los problemas causados por los conflictos no detectados, como son el comportamiento incoherente de las aplicaciones y las actualizaciones perdidas. Cuando se habilita esta opción, de forma predeterminada, un cambio conflictivo se trata como un error crítico que produce el error del Agente de distribución. En caso de conflicto, la topología permanece en un estado incoherente hasta que se resuelve el conflicto y se restablece la coherencia de los datos en toda la topología.

[!NOTA]

Para evitar la posible incoherencia de datos, asegúrese de evitar los conflictos en una topología punto a punto, incluso con la detección de conflictos habilitada. Para asegurarse de que las operaciones de escritura para una fila determinada se realizan en un solo nodo, las aplicaciones que tienen acceso y cambian datos deben particionar las operaciones de inserción, actualización y eliminación. Este particionamiento asegura que las modificaciones introducidas en una fila determinada que se originan en un nodo se sincronizan con todos los demás nodos de la topología antes de que se modifique la fila en otro nodo. Si una aplicación requiere funcionalidades sofisticadas de resolución y detección de conflictos, use la replicación de mezcla. Para obtener más información, vea Información general sobre la replicación de mezcla y Detectar y resolver conflictos de replicación de mezcla.

Descripción de los conflictos y de la detección de conflictos

En una única base de datos, los cambios realizados en la misma fila por parte de aplicaciones diferentes no provocan conflictos. Esto se debe a que las transacciones se serializan y se utilizan bloqueos para controlar los cambios simultáneos. En un sistema distribuido asincrónico, como en uno de replicación punto a punto, las transacciones se producen de forma independiente en cada nodo, y no hay ningún mecanismo para serializarlas por los distintos nodos. Se podría usar una confirmación en dos fases de tipo protocolo, pero esto afecta de forma significativa al rendimiento.

En sistemas como la replicación punto a punto, los conflictos no se detectan cuando los cambios se confirman en cada uno de los nodos del mismo nivel. En su lugar, se detectan al replicar los cambios y aplicarlos a los demás nodos del mismo nivel. En la replicación punto a punto, los conflictos se detectan mediante los procedimientos almacenados que aplican los cambios a cada nodo, basándose en una columna oculta de cada tabla publicada. En esta columna oculta, se almacena un identificador que combina la versión de la fila con un identificador de originador que se especifica para cada nodo. Durante la sincronización, el Agente de distribución ejecuta los procedimientos para cada tabla. Estos procedimientos aplican las operaciones de inserción, actualización y eliminación procedentes de los demás nodos del mismo nivel. Si uno de los procedimientos detecta un conflicto cuando lee el valor de la columna oculta, genera el error 22815 que tiene un nivel de gravedad de 16:

Se detectó un conflicto de tipo '%s' en el nodo %d entre el nodo %d (entrante), con id. de transacción %s y el nodo %d (en el disco), con id. de transacción %s

Este error hace que, de forma predeterminada, el Agente de distribución deje de aplicar cambios a ese nodo. Para obtener información sobre cómo tratar los conflictos detectados, vea "Controlar los conflictos" más adelante en este tema.

[!NOTA]

Sólo pueden tener acceso a la columna oculta los usuarios que hayan iniciado una sesión a través de la conexión de administrador dedicada (DAC). Para obtener información sobre DAC, vea Usar una conexión de administrador dedicada.

La replicación punto a punto detecta los tipos de conflictos siguientes:

  • Inserción-inserción

    Todas las filas de cada tabla que participa en una replicación punto a punto se identifican de forma exclusiva mediante valores de clave principal. Se produce un conflicto de inserción-inserción al insertar una fila con el mismo valor de clave en más de un nodo.

  • Actualización-actualización

    Se produce cuando se actualiza la misma fila en más de un nodo.

  • Inserción-actualización

    Se produce cuando se actualiza una fila en un nodo, pero la misma fila se ha eliminado y, a continuación, se ha vuelto a insertar en otro nodo.

  • Inserción-eliminación

    Se produce cuando se elimina una fila en un nodo, pero la misma fila se ha eliminado y, a continuación, se ha vuelto a insertar en otro nodo.

  • Actualización-eliminación

    Se produce cuando se actualiza una fila en un nodo, pero la misma fila se ha eliminado en otro nodo.

  • Eliminación-eliminación

    Se produce cuando se elimina una fila en más de un nodo.

Habilitar la detección de conflictos

Para utilizar la detección de conflictos, todos los nodos deben estar ejecutando SQL Server 2008 o una versión posterior, y debe estar habilitada la detección para todos los nodos. De forma predeterminada, en SQL Server 2008 y versiones posteriores, la detección de conflictos está habilitada en SQL Server Management Studio. Se recomienda tener habilitada la detección, incluso en escenarios en los que no se espere ningún conflicto. La detección de conflictos se puede habilitar y deshabilitar utilizando Management Studio o procedimientos almacenados de Transact-SQL:

Controlar los conflictos

Cuando se produce un conflicto en la replicación punto a punto, se genera la alerta de detección de conflictos punto a punto. Se recomienda configurar esta alerta para que se notifique la existencia de conflictos. Para obtener más información sobre las alertas, vea Usar alertas para los eventos de agente de replicación.

Una vez que se detenga el Agente de distribución y se genere la alerta, use uno de los métodos siguientes para controlar los conflictos existentes:

  • Reinicialice el nodo en el que se detectó el conflicto a partir de la copia de seguridad de un nodo que contenga los datos necesarios (este es el enfoque recomendado). Este método garantiza que los datos sean coherentes. Para obtener más información, vea el procedimiento para agregar un nodo a una topología en Cómo configurar la replicación transaccional punto a punto (programación de la replicación con Transact-SQL).

  • Intente sincronizar de nuevo el nodo permitiendo que el Agente de distribución continúe aplicando los cambios:

    1. Ejecute sp_changepublication: especifique 'p2p_continue_onconflict' para el parámetro @property y true para el parámetro @value.

    2. Reinicie el Agente de distribución.

    3. Use el visor de conflictos para comprobar los conflictos detectados y determine las filas afectadas, el tipo de conflicto y la fila ganadora. El conflicto se resuelve en función del valor del identificador de originador que se especificó durante la configuración: la fila procedente del nodo con el identificador más alto gana el conflicto. Para obtener más información, vea Cómo ver conflictos de datos para publicaciones transaccionales (SQL Server Management Studio).

    4. Ejecute la validación para asegurarse de que las filas en conflicto convergieron correctamente. Para obtener más información, vea Validar los datos replicados.

      [!NOTA]

      Si los datos son incoherentes después de este paso, debe actualizar manualmente las filas en el nodo que tenga la prioridad más alta y, a continuación, dejar que se propaguen los cambios desde ese nodo. Si no hay ningún otro conflicto relacionado con los cambios en la topología, todos los nodos se encontrarán en un estado coherente.

    5. Ejecute sp_changepublication: especifique 'p2p_continue_onconflict' para el parámetro @property y false para el parámetro @value.