Detección de conflictos en la replicación punto a puntoPeer-to-Peer - Conflict Detection in Peer-to-Peer Replication

SE APLICA A: síSQL Server noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

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.Peer-to-peer transactional replication lets you insert, update, or delete data at any node in a topology and have data changes propagated to the other nodes. Dado que se pueden cambiar los datos de cualquier nodo, podrían producirse conflictos entre los datos modificados en los distintos nodos.Because you can change data at any node, data changes at different nodes could conflict with each other. 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.If a row is modified at more than one node, it can cause a conflict or even a lost update when the row is propagated to other nodes.

La replicación punto a punto de SQL Server 2008SQL Server 2008 y versiones posteriores ofrece la posibilidad de habilitar la detección de conflictos en una topología punto a punto.Peer-to-peer replication in SQL Server 2008SQL Server 2008 and later versions provides the option to enable conflict detection across a peer-to-peer topology. 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.This option would help prevent the issues that are caused by undetected conflicts, including inconsistent application behavior and lost updates. 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.With this option enabled, by default a conflicting change is treated as a critical error that causes the failure of the Distribution Agent. 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.In the event of a conflict, the topology remains in an inconsistent state until the conflict is resolved and the data is made consistent across the topology.

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.To avoid potential data inconsistency, make sure that you avoid conflicts in a peer-to-peer topology, even with conflict detection enabled. 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.To ensure that write operations for a particular row are performed at only one node, applications that access and change data must partition insert, update, and delete operations. 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.This partitioning ensures that modifications to a given row that is originating at one node are synchronized with all other nodes in the topology before the row is modified by a different node. Si una aplicación requiere funcionalidades sofisticadas de detección y resolución de conflictos, use la replicación de mezcla.If an application requires sophisticated conflict detection and resolution capabilities, use merge replication. Para obtener más información, consulte Replicación de mezcla y Detectar y solucionar conflictos de replicación de mezcla.For more information, see Merge Replication and Detect and Resolve Merge Replication Conflicts.

Descripción de los conflictos y de la detección de conflictosUnderstanding Conflicts and Conflict Detection

En una única base de datos, los cambios realizados en la misma fila por parte de aplicaciones diferentes no provocan conflictos.In a single database, changes that are made to the same row by different applications do not cause a conflict. Esto se debe a que las transacciones se serializan y se utilizan bloqueos para controlar los cambios simultáneos.This is because transactions are serialized, and locks are used to handle concurrent changes. 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.In an asynchronous distributed system such as peer-to-peer replication, transactions act independently on each node; and there is no mechanism to serialize transactions across multiple nodes. Se podría usar una confirmación en dos fases de tipo protocolo, pero esto afecta de forma significativa al rendimiento.A protocol like two-phase commit could be used, but this affects performance significantly.

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.In systems such as peer-to-peer replication, conflicts are not detected when changes are committed at individual peers. En su lugar, se detectan al replicar los cambios y aplicarlos a los demás nodos del mismo nivel.Instead, they are detected when those changes are replicated and applied at other peers. 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.In peer-to-peer replication, conflicts are detected by the stored procedures that apply changes to each node, based on a hidden column in each published table. 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.This hidden column stores an ID that combines an originator ID that you specify for each node and the version of the row. Durante la sincronización, el Agente de distribución ejecuta los procedimientos para cada tabla.During synchronization, the Distribution Agent executes procedures for each table. Estos procedimientos aplican las operaciones de inserción, actualización y eliminación procedentes de los demás nodos del mismo nivel.These procedures apply insert, update, and delete operations from other peers. 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:If one of the procedures detects a conflict when it reads the hidden column value, it raises error 22815 that has a severity level of 16:

A conflict of type '%s' was detected at peer %d between peer %d (incoming), transaction id %s and peer %d (on disk), transaction id %s

Este error hace que, de forma predeterminada, el Agente de distribución deje de aplicar cambios a ese nodo.By default, this error causes the Distribution Agent to stop applying changes to that node. Para obtener información sobre cómo tratar los conflictos detectados, vea "Controlar los conflictos" más adelante en este tema.For information about how to handle the conflicts that are detected, see "Handling Conflicts" later in this topic.

Nota

Solo 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).The hidden column can be accessed only by a user that is logged in through the Dedicated Administrator Connection (DAC). Para obtener más información sobre DAC, vea Conexión de diagnóstico para administradores de bases de datos.For information about DAC, see Diagnostic Connection for Database Administrators.

La replicación punto a punto detecta los tipos de conflictos siguientes:Peer-to-peer replication detects the following types of conflicts:

  • Inserción-inserciónInsert-insert

    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.All rows in each table participating in peer-to-peer replication are uniquely identified by using primary key values. 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.An insert-insert conflict occurs when a row with the same key value was inserted at more than one node.

  • Actualización-actualizaciónUpdate-update

    Se produce cuando se actualiza la misma fila en más de un nodo.Occurs when the same row was updated at more than one node.

  • Inserción-actualizaciónInsert-update

    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.Occurs if a row was updated at one node, but the same row was deleted and then reinserted at another node.

  • Inserción-eliminaciónInsert-delete

    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.Occurs if a row was deleted at one node, but the same row was deleted and then reinserted at another node.

  • Actualización-eliminaciónUpdate-delete

    Se produce cuando se actualiza una fila en un nodo, pero la misma fila se ha eliminado en otro nodo.Occurs if a row was updated at one node, but the same row was deleted at another node.

  • Eliminación-eliminaciónDelete-delete

    Se produce cuando se elimina una fila en más de un nodo.Occurs when a row was deleted at more than one node.

Habilitar la detección de conflictosEnabling Conflict Detection

Para utilizar la detección de conflictos, todos los nodos deben estar ejecutando SQL Server 2008SQL Server 2008 o una versión posterior, y debe haberse habilitado la detección para todos los nodos.To use conflict detection, all nodes must be running SQL Server 2008SQL Server 2008 or a later version; and detection must be enabled for all nodes. De forma predeterminada, en SQL Server 2008SQL Server 2008 y versiones posteriores, la detección de conflictos está habilitada en SQL Server Management StudioSQL Server Management Studio.In SQL Server 2008SQL Server 2008 and later versions, by default, conflict detection is enabled in SQL Server Management StudioSQL Server Management Studio. Se recomienda tener habilitada la detección, incluso en escenarios en los que no se espere ningún conflicto.We recommend that you have detection enabled, even in scenarios in which you do not expect any conflicts. La detección de conflictos se puede habilitar y deshabilitar utilizando Management StudioManagement Studio o procedimientos almacenados de Transact-SQLTransact-SQL :Conflict detection can be enabled and disabled by using Management StudioManagement Studio or Transact-SQLTransact-SQL stored procedures:

  • Puede habilitar y deshabilitar la detección en Management StudioManagement Studio mediante la página Opciones de suscripción del cuadro de diálogo Propiedades de la publicación o con la página Configurar topología del Asistente de configuración de la topología punto a punto.You can enable and disable detection in Management StudioManagement Studio either by using the Subscription Options page of the Publication Properties dialog box or the Configure Topology page of the Configure Peer-to-Peer Topology Wizard. Para obtener más información, consulte Conflict Detection in Peer-to-Peer Replication.For more information, see Conflict Detection in Peer-to-Peer Replication.

    Si configura la detección de conflictos mediante Management StudioManagement Studio, el Agente de distribución se configura para que deje de aplicar cambios cuando se detecte un conflicto.If you configure conflict detection by using Management StudioManagement Studio, the Distribution Agent is configured to stop applying changes when a conflict is detected.

  • También puede habilitar y deshabilitar la detección con los procedimientos almacenados siguientes: sp_addpublication o sp_configure_peerconflictdetection.You can also enable and disable detection by using the following stored procedures: sp_addpublication or sp_configure_peerconflictdetection.

    Si configura la detección de conflictos mediante procedimientos almacenados, puede especificar si el Agente de distribución debe dejar de aplicar cambios cuando se detecte un conflicto.If you configure conflict detection by using stored procedures, you can specify whether the Distribution Agent should stop applying changes when a conflict is detected. La configuración predeterminada hace que el agente se detenga.The default is for the agent to stop. Se recomienda utilizar la configuración predeterminada.We recommend that you use the default setting.

Controlar los conflictosHandling Conflicts

Cuando se produce un conflicto en la replicación punto a punto, se genera la alerta de detección de conflictos punto a punto.When a conflict occurs in peer-to-peer replication, the Peer-to-peer conflict detection alert is raised. Se recomienda configurar esta alerta para que se notifique la existencia de conflictos.We recommend that you configure this alert so that you are notified when a conflict occurs. Para obtener más información sobre las alertas, vea Usar alertas para eventos del Agente de replicación.For more information about alerts, see Use Alerts for Replication Agent Events.

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:After the Distribution Agent stops and the alert is raised, use one of the following approaches to handle the conflicts that occurred:

  • 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).Reinitialize the node where the conflict was detected from the backup of a node that contains the required data (the recommended approach). Este método garantiza que los datos sean coherentes.This method ensures that data is in a consistent state.

  • Intente sincronizar de nuevo el nodo permitiendo que el Agente de distribución continúe aplicando los cambios:Try to synchronize the node again by enabling the Distribution Agent to continue to apply changes:

    1. Ejecute sp_changepublication: especifique "p2p_continue_onconflict" para el parámetro @property y true para el parámetro @value.Execute sp_changepublication: specify 'p2p_continue_onconflict' for the @property parameter and true for the @value parameter.

    2. Reinicie el Agente de distribución.Restart the Distribution Agent.

    3. Use el visor de conflictos para comprobar los conflictos detectados y determine las filas afectadas, el tipo de conflicto y la fila ganadora.Verify the conflicts that were detected by using the conflict viewer and determine the rows that were involved, the type of conflict, and the winner. 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.The conflict is resolved based on the originator ID value that you specified during configuration: the row that originated at the node with the highest ID wins the conflict. Para obtener más información, vea Ver conflictos de datos para publicaciones transaccionales (SQL Server Management Studio).For more information, see View Data Conflicts for Transactional Publications (SQL Server Management Studio).

    4. Ejecute la validación para asegurarse de que las filas en conflicto convergieron correctamente.Run validation to ensure that the conflicting rows converged correctly. Para obtener más información, vea Validar datos replicados.For more information, see Validate Replicated Data.

      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.If data is inconsistent after this step, you must manually update rows on the node that has the highest priority, and then let the changes propagate from this node. 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.If there are no further conflicting changes in the topology, all nodes will be brought to a consistent state.

    5. Ejecute sp_changepublication: especifique "p2p_continue_onconflict" para el parámetro @property y false para el parámetro @value.Execute sp_changepublication: specify 'p2p_continue_onconflict' for the @property parameter and false for the @value parameter.

Consulte tambiénSee Also

Peer-to-Peer Transactional ReplicationPeer-to-Peer Transactional Replication