Peer-to-peer - Rilevamento dei conflitti nella replicaPeer-to-Peer - Conflict Detection in Peer-to-Peer Replication

La replica transazionale peer-to-peer consente di inserire, aggiornare o eliminare dati in qualsiasi nodo di una topologia e di propagare le modifiche agli altri nodi.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. Poiché è possibile modificare i dati in qualsiasi nodo, si potrebbe verificare un conflitto tra le modifiche apportate ai dati in nodi diversi.Because you can change data at any node, data changes at different nodes could conflict with each other. Se una riga viene modificata in più nodi, può causare un conflitto o persino la perdita di un aggiornamento quando viene propagata in altri nodi.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.

Con la replica peer-to-peer in SQL Server 2008SQL Server 2008 e versioni successive, viene introdotta l'opzione che consente di abilitare il rilevamento dei conflitti in una topologia peer-to-peer.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. Questa opzione consente di evitare problemi causati da conflitti non rilevati, tra cui il comportamento incoerente dell'applicazione e la perdita di aggiornamenti.This option would help prevent the issues that are caused by undetected conflicts, including inconsistent application behavior and lost updates. Se questa opzione è abilitata, per impostazione predefinita una modifica in conflitto viene considerata come un errore critico che impedisce il corretto funzionamento dell'agente di distribuzione.With this option enabled, by default a conflicting change is treated as a critical error that causes the failure of the Distribution Agent. In caso di conflitto, la topologia rimane in uno stato incoerente finché il conflitto non viene risolto e i dati non vengono resi coerenti nell'intera topologia.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

Per prevenire potenziali incoerenze dei dati, evitare che si verifichino conflitti in una topologia peer-to-peer, anche quando il rilevamento dei conflitti è abilitato.To avoid potential data inconsistency, make sure that you avoid conflicts in a peer-to-peer topology, even with conflict detection enabled. Per garantire che le operazioni di scrittura relative a una determinata riga vengano eseguite in un unico nodo, le applicazioni che accedono e modificano i dati devono partizionare le operazioni di inserimento, aggiornamento ed eliminazione.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. Tale partizionamento assicura che le modifiche apportate a una determinata riga in un singolo nodo vengano sincronizzate con tutti gli altri nodi della topologia prima che la riga venga modificata da un nodo diverso.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. Se un'applicazione richiede funzionalità avanzate di rilevamento e risoluzione dei conflitti, utilizzare la replica di tipo merge.If an application requires sophisticated conflict detection and resolution capabilities, use merge replication. Per altre informazioni, vedere Replica di tipo merge e Rilevare e risolvere i conflitti tra repliche di tipo merge.For more information, see Merge Replication and Detect and Resolve Merge Replication Conflicts.

Informazioni sui conflitti e sul relativo rilevamentoUnderstanding Conflicts and Conflict Detection

In un singolo database le modifiche apportate alla stessa riga da applicazioni diverse non generano un conflitto,In a single database, changes that are made to the same row by different applications do not cause a conflict. in quanto le transazioni sono serializzate e vengono utilizzati blocchi per gestire le modifiche simultanee.This is because transactions are serialized, and locks are used to handle concurrent changes. In un sistema distribuito asincrono, ad esempio la replica peer-to-peer, le transazioni agiscono in modo indipendente su ogni nodo e non sono presenti meccanismi per serializzarle tra più nodi.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. È possibile utilizzare un protocollo come il commit 2PC, che tuttavia influisce in modo significativo sulle prestazioni.A protocol like two-phase commit could be used, but this affects performance significantly.

Nei sistemi come la replica peer-to-peer i conflitti non vengono rilevati quando viene eseguito il commit delle modifiche nei singoli peer.In systems such as peer-to-peer replication, conflicts are not detected when changes are committed at individual peers. Vengono invece rilevati quando queste modifiche vengono replicate e applicate in altri peer.Instead, they are detected when those changes are replicated and applied at other peers. Nella replica peer-to-peer i conflitti vengono rilevati dalle stored procedure che applicano le modifiche a ogni nodo, in base a una colonna nascosta in ogni tabella pubblicata.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. Questa colonna nascosta archivia un ID costituito dalla combinazione tra un ID origine specificato per ogni nodo e la versione della riga.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 sincronizzazione, l'agente di distribuzione esegue le procedure per ogni tabella.During synchronization, the Distribution Agent executes procedures for each table. Queste procedure applicano le operazioni di inserimento, aggiornamento ed eliminazione da altri peer.These procedures apply insert, update, and delete operations from other peers. Se una delle procedure rileva un conflitto quando legge il valore della colonna nascosta, genera l'errore 22815 con un livello di gravità 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

Per impostazione predefinita, a causa di questo errore l'agente di distribuzione arresta l'applicazione di modifiche a tale nodo.By default, this error causes the Distribution Agent to stop applying changes to that node. Per informazioni su come gestire i conflitti rilevati, vedere "Gestione dei conflitti" più avanti in questo argomento.For information about how to handle the conflicts that are detected, see "Handling Conflicts" later in this topic.

Nota

Alla colonna nascosta può accedere solo un utente connesso tramite la connessione amministrativa dedicata (DAC, Dedicated Administrator Connection).The hidden column can be accessed only by a user that is logged in through the Dedicated Administrator Connection (DAC). Per informazioni sulle connessioni DAC, vedere Connessione di diagnostica per gli amministratori di database.For information about DAC, see Diagnostic Connection for Database Administrators.

La replica peer-to-peer rileva i tipi seguenti di conflitti:Peer-to-peer replication detects the following types of conflicts:

  • Inserimento-inserimentoInsert-insert

    Tutte le righe di ogni tabella che partecipa alla replica peer-to-peer sono identificate in modo univoco tramite valori di chiave primaria.All rows in each table participating in peer-to-peer replication are uniquely identified by using primary key values. Un conflitto di tipo inserimento-inserimento si verifica quando viene inserita una riga con lo stesso valore di chiave in più di un nodo.An insert-insert conflict occurs when a row with the same key value was inserted at more than one node.

  • Aggiornamento-aggiornamentoUpdate-update

    Si verifica quando la stessa riga viene aggiornata in più di un nodo.Occurs when the same row was updated at more than one node.

  • Inserimento-aggiornamentoInsert-update

    Si verifica se una riga viene aggiornata in un nodo ma viene anche eliminata e quindi reinserita in un altro nodo.Occurs if a row was updated at one node, but the same row was deleted and then reinserted at another node.

  • Inserimento-eliminazioneInsert-delete

    Si verifica se una riga viene eliminata in un nodo ma viene anche eliminata e quindi reinserita in un altro nodo.Occurs if a row was deleted at one node, but the same row was deleted and then reinserted at another node.

  • Aggiornamento-eliminazioneUpdate-delete

    Si verifica se una riga viene aggiornata in un nodo ma viene anche eliminata in un altro nodo.Occurs if a row was updated at one node, but the same row was deleted at another node.

  • Eliminazione-eliminazioneDelete-delete

    Si verifica quando una riga viene eliminata in più di un nodo.Occurs when a row was deleted at more than one node.

Abilitazione del rilevamento dei conflittiEnabling Conflict Detection

Per usare il rilevamento dei conflitti, tutti i nodi devono eseguire SQL Server 2008SQL Server 2008 o versioni successive e il rilevamento deve essere abilitato per tutti i nodi.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. In SQL Server 2008SQL Server 2008 e versioni successive il rilevamento dei conflitti è abilitato per impostazione predefinita in 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. Si consiglia di lasciare abilitato il rilevamento, anche negli scenari in cui non si prevedono conflitti.We recommend that you have detection enabled, even in scenarios in which you do not expect any conflicts. Per abilitare e disabilitare il rilevamento dei conflitti, è possibile utilizzare le stored procedure Management StudioManagement Studio o Transact-SQLTransact-SQL :Conflict detection can be enabled and disabled by using Management StudioManagement Studio or Transact-SQLTransact-SQL stored procedures:

  • Per abilitare e disabilitare il rilevamento in Management StudioManagement Studio , è possibile utilizzare la pagina Opzioni della sottoscrizione della finestra di dialogo Proprietà pubblicazione o la pagina Configura topologia della Configurazione guidata topologia peer-to-peer.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. Per altre informazioni, vedere Conflict Detection in Peer-to-Peer Replication.For more information, see Conflict Detection in Peer-to-Peer Replication.

    Se si configura il rilevamento dei conflitti utilizzando Management StudioManagement Studio, l'agente di distribuzione viene configurato per arrestare l'applicazione di modifiche quando viene rilevato un conflitto.If you configure conflict detection by using Management StudioManagement Studio, the Distribution Agent is configured to stop applying changes when a conflict is detected.

  • Per abilitare e disabilitare il rilevamento, è anche possibile utilizzare le stored procedure seguenti: 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.

    Se si configura il rilevamento dei conflitti utilizzando le stored procedure, è possibile specificare se l'agente di distribuzione deve arrestare l'applicazione di modifiche quando viene rilevato un conflitto.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. Per impostazione predefinita, l'agente si arresta.The default is for the agent to stop. È consigliabile utilizzare l'impostazione predefinita.We recommend that you use the default setting.

Gestione dei conflittiHandling Conflicts

Quando si verifica un conflitto nella replica peer-to-peer, viene generato l'avviso di rilevamento dei conflitti peer-to-peer.When a conflict occurs in peer-to-peer replication, the Peer-to-peer conflict detection alert is raised. Si consiglia di configurare questo avviso in modo da ricevere una notifica quando si verifica un conflitto.We recommend that you configure this alert so that you are notified when a conflict occurs. Per altre informazioni sugli avvisi, vedere Usare gli avvisi per gli eventi degli agenti di replica.For more information about alerts, see Use Alerts for Replication Agent Events.

Dopo l'arresto dell'agente di distribuzione e la generazione dell'avviso, utilizzare uno degli approcci seguenti per gestire i conflitti che si sono verificati:After the Distribution Agent stops and the alert is raised, use one of the following approaches to handle the conflicts that occurred:

  • Reinizializzare il nodo in cui è stato rilevato il conflitto dal backup di un nodo contenente i dati necessari (approccio consigliato).Reinitialize the node where the conflict was detected from the backup of a node that contains the required data (the recommended approach). Questo metodo assicura che i dati siano in uno stato coerente.This method ensures that data is in a consistent state.

  • Tentare di sincronizzare nuovamente il nodo consentendo all'agente di distribuzione di continuare ad applicare le modifiche:Try to synchronize the node again by enabling the Distribution Agent to continue to apply changes:

    1. Eseguire sp_changepublication: specificare 'p2p_continue_onconflict' per il parametro @property e true per il parametro @value.Execute sp_changepublication: specify 'p2p_continue_onconflict' for the @property parameter and true for the @value parameter.

    2. Riavviare l'agente di distribuzione.Restart the Distribution Agent.

    3. Verificare i conflitti rilevati utilizzando il Visualizzatore conflitti e determinare le righe coinvolte, il tipo di conflitto e la riga in conflitto confermata.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. Il conflitto viene risolto in base al valore di ID origine specificato durante la configurazione: la riga che ha origine nel nodo con l'ID più alto è la riga in conflitto confermata.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. Per altre informazioni, vedere Visualizzare i conflitti di dati per le pubblicazioni transazionali (SQL Server Management Studio).For more information, see View Data Conflicts for Transactional Publications (SQL Server Management Studio).

    4. Eseguire la convalida per assicurare la corretta convergenza delle righe in conflitto.Run validation to ensure that the conflicting rows converged correctly. Per altre informazioni, vedere Convalidare i dati replicati.For more information, see Validate Replicated Data.

      Nota

      Se i dati sono incoerenti dopo questo passaggio, è necessario aggiornare manualmente le righe sul nodo con la massima priorità, quindi consentire la propagazione delle modifiche da questo 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. Se non sono presenti ulteriori modifiche in conflitto nella topologia, tutti i nodi verranno portati in uno stato coerente.If there are no further conflicting changes in the topology, all nodes will be brought to a consistent state.

    5. Eseguire sp_changepublication: specificare 'p2p_continue_onconflict' per il parametro @property e false per il parametro @value.Execute sp_changepublication: specify 'p2p_continue_onconflict' for the @property parameter and false for the @value parameter.

Vedere ancheSee Also

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