Rilevamento e risoluzione dei conflitti nell'aggiornamento in coda
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. In questo caso, vengono confermate solo le modifiche apportate in una posizione.
Conflitti di eliminazione. Si verificano se la stessa riga viene eliminata in una posizione e modificata in un'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 attiva l'aggiornamento in coda, viene aggiunta alla tabella sottostante una colonna di tipo uniqueidentifier (msrepl_tran_version) con il valore predefinito newid(). 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. L'agente di lettura coda utilizza questa colonna durante la sincronizzazione per determinare se esiste un conflitto.
Le transazioni inserite in una coda mantengono i valori di versione nuovi e vecchi delle righe. 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. In seguito all'aggiornamento della pubblicazione con il GUID della transazione, le versioni delle righe nella pubblicazione corrispondono alle versioni della transazione.
Se il vecchio GUID archiviato nella transazione non corrisponde al GUID della pubblicazione, viene rilevato un conflitto. 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. 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. L'agente di lettura coda gestisce le versioni diverse della stessa riga rilevate durante la sincronizzazione in base al sistema di risoluzione dei conflitti. 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 il server di pubblicazione (impostazione predefinita)
Prevale il server di pubblicazione e la sottoscrizione viene reinizializzata
Prevale il Sottoscrittore
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: Procedura: Impostazione delle opzioni di risoluzione dei conflitti per l'aggiornamento in coda (SQL Server Management Studio)
Programmazione Transact-SQL della replica: Procedura: Attivazione delle sottoscrizioni aggiornabili per le pubblicazioni transazionali (programmazione Transact-SQL della replica)
Per visualizzare i conflitti di dati
- SQL Server Management Studio: Procedura: Visualizzazione di conflitti di dati per le pubblicazioni transazionali (SQL Server Management Studio)
Prevale il server di pubblicazione
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. 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 in modo che corrispondano alla riga nel server di pubblicazione.
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 Uncomitted. Per le successive transazioni dipendenti che possono verificarsi, non è prevista alcuna compensazione. 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.
Prevale il server di pubblicazione 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.
Prevale il Sottoscrittore
Il rilevamento dei conflitti in base al criterio Prevale il Sottoscrittore implica che l'ultima transazione del Sottoscrittore che aggiorna il server di pubblicazione risulta prioritaria. In questo caso, quando viene rilevato un conflitto, viene comunque utilizzata la transazione inviata dal Sottoscrittore e il server di pubblicazione viene aggiornato. Questo criterio è adatto alle applicazioni in cui tali modifiche non compromettono l'integrità dei dati.