Sottoscrizioni aggiornabili - Risoluzione dei conflitti per l'aggiornamento in codaUpdatable Subscriptions - Queued Updating Conflict Resolution

Dato che le sottoscrizioni ad aggiornamento in coda consentono la modifica degli stessi dati in più posizioni, è possibile che durante la sincronizzazione dei dati nel server di pubblicazione si verifichino conflitti.Because queued updating subscriptions allow modifications to the same data at multiple locations, there may be conflicts when data is synchronized at the Publisher. I conflitti vengono rilevati quando le modifiche vengono sincronizzate con il server di pubblicazione e vengono risolti in base ai criteri di risoluzione selezionati durante la creazione della pubblicazione.Replication detects any conflicts when changes are synchronized with the Publisher and resolves those conflicts using the resolution policy you selected when creating the publication. È possibile che si verifichino i conflitti seguenti:The following conflicts can occur:

  • Conflitti di aggiornamento e inserimento.Update and insert conflicts. Questo tipo di conflitti si verifica quando gli stessi dati vengono modificati in due posizioni diverse.This conflict happens when the same data is changed at two locations. In questo caso, vengono confermate solo le modifiche apportate in una posizione.One change wins, and the other one loses.

  • Conflitti di eliminazione.Delete conflicts. Si verificano se la stessa riga viene eliminata in una posizione e modificata in un'altra.This conflict occurs when the same row is deleted at one location and changed at the other.

    Il rilevamento e la risoluzione dei conflitti può richiedere tempi lunghi e un numero elevato di risorse. È pertanto consigliabile ridurre al minimo i conflitti nelle applicazioni tramite la creazione di partizioni di dati in modo da consentire la modifica di subset di dati diversi in Sottoscrittori diversi.Conflict detection and resolution can be a time-consuming and resource-intensive process; therefore, it is best to minimize conflicts in the application by creating data partitions so that different Subscribers modify different subsets of data.

Rilevamento dei conflittiDetecting Conflicts

Quando si crea una pubblicazione e si abilita l'aggiornamento in coda, viene aggiunta alla tabella sottostante una colonna di tipo uniqueidentifier (msrepl_tran_version) con il valore predefinito newid() .When creating a publication and enabling queued updating, replication adds a uniqueidentifier column (msrepl_tran_version) with the default of newid() to the underlying table. Quando si modificano i dati pubblicati nel server di pubblicazione o nel Sottoscrittore, le righe ricevono un nuovo identificatore univoco globale (GUID) a indicare che esiste una nuova versione della riga.When published data is changed at either the Publisher or the Subscriber, the row receives a new globally unique identifier (GUID) to indicate that a new row version exists. L'agente di lettura coda utilizza questa colonna durante la sincronizzazione per determinare se esiste un conflitto.The Queue Reader Agent uses this column during synchronization to determine if a conflict exists.

Le transazioni inserite in una coda mantengono i valori di versione nuovi e vecchi delle righe.A transaction in a queue maintains the old and new row version values. Quando la transazione viene applicata al server di pubblicazione, vengono confrontati i GUID della transazione e il GUID della pubblicazione.When the transaction is applied at the Publisher, the GUIDs from the transaction and the GUID in the publication are compared. Se il vecchio GUID archiviato nella transazione corrisponde al GUID della pubblicazione, la pubblicazione viene aggiornata e il nuovo GUID viene assegnato alla riga generata dal Sottoscrittore.If the old GUID stored in the transaction matches the GUID in the publication, the publication is updated and the row is assigned the new GUID that was generated by the Subscriber. In seguito all'aggiornamento della pubblicazione con il GUID della transazione, le versioni delle righe nella pubblicazione corrispondono alle versioni della transazione.By updating the publication with the GUID from the transaction, you have matching row versions in the publication and in the transaction.

Se il vecchio GUID archiviato nella transazione non corrisponde al GUID della pubblicazione, viene rilevato un conflitto.If the old GUID stored in the transaction does not match the GUID in the publication, a conflict is detected. Il nuovo GUID della pubblicazione indica che esistono due diverse versioni della riga: una versione nella transazione inviata dal Sottoscrittore e una versione più recente nel server di pubblicazione.The new GUID in the publication indicates that two different row versions exist: one in the transaction being submitted by the Subscriber and a newer one that exists on the Publisher. Ciò significa che un altro Sottoscrittore o il server di pubblicazione hanno aggiornato la stessa riga della pubblicazione prima della sincronizzazione della transazione da parte del server di sottoscrizione.In this case, another Subscriber or the Publisher updated the same row in the publication before this Subscriber transaction was synchronized.

A differenza della replica di tipo merge, le colonne GUID non vengono utilizzate per identificare la riga stessa, ma per verificare se è stata modificata.Unlike merge replication, the use of a GUID column is not used to identify the row itself, but is used to check if the row has changed.

Risoluzione dei conflittiResolving Conflicts

Quando si crea una pubblicazione configurata per l'aggiornamento in coda, si seleziona un sistema di risoluzione dei conflitti da utilizzare qualora venissero rilevati dei conflitti.When you create a publication using queued updating, you select a conflict resolver to be used if any conflicts are detected. L'agente di lettura coda gestisce le versioni diverse della stessa riga rilevate durante la sincronizzazione in base al sistema di risoluzione dei conflitti.The conflict resolver governs how the Queue Reader Agent handles different versions of the same row encountered during synchronization. Dopo la creazione della pubblicazione è tuttavia possibile modificare i criteri di risoluzione dei conflitti a condizione che non esistano sottoscrizioni della pubblicazione.You can change the conflict resolution policy after the publication is created as long as there are no subscriptions to the publication. Le opzioni del sistema di risoluzione dei conflitti sono le seguenti:The conflict resolver choices are the following:

Prevale il server di pubblicazionePublisher Wins

Quando il criterio di risoluzione dei conflitti è impostato su Prevale il server di pubblicazione, la consistenza transazionale viene mantenuta in base ai dati del server di pubblicazione.When the conflict resolution is set to the Publisher wins, transactional consistency is maintained based on the data at the Publisher. Viene eseguito il rollback della transazione in conflitto nel Sottoscrittore in cui è stata inizializzata.The conflicting transaction is rolled back at the Subscriber that initiated it.

Quando l'agente di lettura coda rileva un conflitto, vengono generati i comandi di compensazione, i quali vengono distribuiti al Sottoscrittore inserendoli nel database di distribuzione.The Queue Reader Agent detects a conflict and compensating commands are generated and propagated to the Subscriber by posting them in the distribution database. L'agente di distribuzione applica quindi i comandi di compensazione al Sottoscrittore che ha originato la transazione in conflitto.The Distribution Agent then applies the compensating commands to the Subscriber that originated the conflicting transaction. Le azioni di compensazione aggiornano le righe nel Sottoscrittore in modo che corrispondano alla riga nel server di pubblicazione.The compensating actions update the rows on the Subscriber to match the rows on the Publisher.

Fino a quando non vengono applicati i comandi di compensazione, è possibile leggere i risultati di una transazione di cui verrà eseguito il rollback nel Sottoscrittore.Until the compensating commands are applied, it is possible to read the results of a transaction that will eventually be rolled back at the Subscriber. Ciò equivale a una lettura dirty, ovvero al livello di isolamento Read Uncommitted.This is equivalent to a dirty read (read uncommitted isolation level). Per le successive transazioni dipendenti che possono verificarsi, non è prevista alcuna compensazione.There is no compensation for the subsequent dependent transactions that can occur. Vengono comunque rispettati i limiti delle transazioni e viene eseguito il commit, oppure in caso di conflitto, il rollback di tutte le azioni all'interno di una transazione.However, transaction boundaries are honored and all the actions within a transaction are either committed, or in the case of a conflict, rolled back.

Prevale il server di pubblicazione e la sottoscrizione viene reinizializzataPublisher Wins and the Subscription Is Reinitialized

La reinizializzazione del Sottoscrittore per la risoluzione dei conflitti consente di mantenere un grado elevato di consistenza transazionale nel Sottoscrittore, ma può richiedere molto tempo se la pubblicazione contiene una quantità di dati elevata.Reinitializing the Subscriber to resolve conflicts maintains strict transactional consistency at the Subscriber, but it can be time consuming if the publication contains large amounts of data.

Quando l'agente di lettura coda rileva un conflitto, le altre transazioni della coda, compresa la transazione in conflitto, vengono rifiutate e il Sottoscrittore viene contrassegnato per la reinizializzazione.When the Queue Reader Agent detects a conflict, all remaining transactions in the queue (including the transaction in conflict) are rejected, and the Subscriber is marked for reinitialization. Il successivo snapshot generato per la pubblicazione viene applicato dall'agente di distribuzione al Sottoscrittore.The next snapshot generated for the publication is applied by the Distribution Agent to the Subscriber.

Prevale il SottoscrittoreSubscriber Wins

Il rilevamento dei conflitti in base ai criteri Prevale il Sottoscrittore implica che l'ultima transazione del Sottoscrittore che aggiorna il server di pubblicazione risulta prioritaria.Conflict detection under the Subscriber wins policy means the last Subscriber transaction to update the Publisher wins. In questo caso, quando viene rilevato un conflitto, viene comunque utilizzata la transazione inviata dal Sottoscrittore e il server di pubblicazione viene aggiornato.In this case, when a conflict is detected, the transaction sent by the Subscriber is still used and the Publisher is updated. Questi criteri sono adatti alle applicazioni in cui tali modifiche non compromettono l'integrità dei dati.This policy is suitable for applications where such changes do not compromise data integrity.

Vedere ancheSee Also

Updatable Subscriptions for Transactional ReplicationUpdatable Subscriptions for Transactional Replication