Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server
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. 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. È possibile che si verifichino i conflitti seguenti:
Conflitti di aggiornamento e inserimento. Questo tipo di conflitti si verifica quando gli stessi dati vengono modificati in due posizioni diverse. Una modifica prevale e l'altra viene scartata.
Elimina i conflitti. Questo conflitto si verifica quando la stessa riga viene eliminata in una posizione e modificata nell'altra.
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.
Rilevamento dei conflitti
Quando si crea una pubblicazione e si abilita l'aggiornamento in coda, la replica aggiunge alla tabella sottostante una colonna uniqueidentifier (msrepl_tran_version) con il valore predefinito newid(). Quando i dati pubblicati vengono modificati nel Publisher o nello Subscriber, la riga riceve un nuovo identificatore univoco globale (GUID) per indicare che esiste una nuova versione della riga. L'agente di lettura coda utilizza questa colonna durante la sincronizzazione per determinare se esiste un conflitto.
Una transazione in una coda mantiene i valori della versione precedente e nuova della riga. Quando la transazione viene applicata al server di pubblicazione, vengono confrontati i GUID della transazione e il GUID della pubblicazione. 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. Aggiornando la pubblicazione con il GUID della transazione, si ottengono versioni delle righe corrispondenti nella pubblicazione e nella transazione.
Se il vecchio GUID archiviato nella transazione non corrisponde al GUID della pubblicazione, viene rilevato un conflitto. Il nuovo GUID nella pubblicazione indica che esistono due versioni diverse della riga: una nella transazione inviata dal Sottoscrittore e una più recente presente nell'Editore. 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.
A differenza della replica di tipo merge, le colonne GUID non vengono utilizzate per identificare la riga stessa, ma per verificare se è stata modificata.
Risoluzione dei conflitti
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. Il meccanismo di risoluzione dei conflitti determina il modo in cui l'agente di lettura della coda gestisce le diverse versioni della stessa riga rilevate durante la sincronizzazione. Dopo la creazione della pubblicazione è tuttavia possibile modificare i criteri di risoluzione dei conflitti a condizione che non esistano sottoscrizioni della pubblicazione. Le opzioni del sistema di risoluzione dei conflitti sono le seguenti:
Prevale l'editore (impostazione predefinita)
Il Publisher ha la precedenza e la sottoscrizione viene reinizializzata
L'abbonato vince
I conflitti vengono registrati e possono essere visualizzati tramite il Visualizzatore conflitti.
Per impostare il criterio di risoluzione dei conflitti per l'aggiornamento in coda
SQL Server Management Studio: Impostare le opzioni di risoluzione dei conflitti per l'aggiornamento in coda (SQL Server Management Studio)
Programmazione in Transact-SQL della replica: Abilitare le sottoscrizioni aggiornabili per le pubblicazioni transazionali
Per visualizzare i conflitti di dati
- SQL Server Management Studio: Visualizzazione dei conflitti di dati per le pubblicazioni transazionali (SQL Server Management Studio)
L'editore vince
Quando il criterio di risoluzione dei conflitti è impostato su prevale il Publisher, la consistenza transazionale viene mantenuta in base ai dati presenti nel Publisher. Viene eseguito il rollback della transazione in conflitto nel Sottoscrittore in cui è stata inizializzata.
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. L'agente di distribuzione applica quindi i comandi di compensazione al Sottoscrittore che ha originato la transazione in conflitto. Le azioni di compensazione aggiornano le righe nel Sottoscrittore per farle corrispondere alle righe nell’Editore.
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. Ciò equivale a una lettura dirty, ovvero al livello di isolamento Read Uncommitted. Per le successive transazioni dipendenti che possono verificarsi, non è prevista alcuna compensazione. Tuttavia, i confini delle transazioni vengono rispettati e tutte le azioni all'interno di una transazione vengono confermate oppure, in caso di conflitto, annullate.
L'editore ha la precedenza e la sottoscrizione viene reinizializzata
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.
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. Il successivo snapshot generato per la pubblicazione viene applicato dall'agente di distribuzione al Sottoscrittore.
L'Abbonato Vince
Il rilevamento dei conflitti con il criterio in base al quale prevale il Sottoscrittore significa che prevale l'ultima transazione del Sottoscrittore che aggiorna l'Autore di pubblicazione. In questo caso, quando viene rilevato un conflitto, viene comunque utilizzata la transazione inviata dal Sottoscrittore e il server di pubblicazione viene aggiornato. Questi criteri sono adatti alle applicazioni in cui tali modifiche non compromettono l'integrità dei dati.