Conflitti nella replica di tipo merge avanzata - Risoluzione nel record logico

Si applica a:SQL Server

In questo argomento vengono illustrate le varie combinazioni di metodi possibili per il rilevamento e la risoluzione dei conflitti nell'utilizzo di record logici. Nella replica di merge si verificano conflitti quando più di un nodo modifica gli stessi dati oppure quando, durante la replica di modifiche, si riscontrano determinati tipi di errori, ad esempio la violazione di un vincolo. Per ulteriori informazioni sul rilevamento e sulla risoluzione dei conflitti, vedere Advanced Merge Replication Conflict Detection and Resolution.

Per specificare il rilevamento dei conflitti e il livello di risoluzione per un articolo, vedere Modify Merge Replication options (Modificare le opzioni per la replica di tipo merge).

Rilevamento dei conflitti

La modalità con cui vengono rilevati i conflitti per i record logici è determinata da due proprietà degli articoli: column_tracking e logical_record_level_conflict_detection. SQL Server 2005 (9.x) e versioni successive supportano anche rilevamento a livello di record logico.

La proprietà articolo logical_record_level_conflict_detection può essere impostata su TRUE o FALSE. Il valore deve essere impostato solo per l'articolo padre di primo livello e verrà ignorato dagli articoli figlio. Se questo valore è impostato su FALSE, nella replica di tipo merge i conflitti vengono rilevati come nelle precedenti versioni di SQL Server, ovvero esclusivamente in base al valore della proprietà column_tracking dell'articolo. Se questo valore è TRUE, la replica di tipo merge ignorerà la proprietà column_tracking dell'articolo e rileverà un conflitto se vengono apportate modifiche in qualsiasi parte del record logico. Ad esempio, si consideri lo scenario seguente:

Record logico per tre tabelle con valori

Viene rilevato un conflitto se due utenti modificano uno qualsiasi dei valori del record logico Customer2 nelle tabelle Customers, Orderso OrderItems . Questo esempio riguarda modifiche apportate tramite un'istruzione UPDATE, ma il conflitto può essere rilevato anche da modifiche apportate con istruzioni INSERT o DELETE.

Risoluzione dei conflitti

Per impostazione predefinita, la replica di merge utilizza una logica basata sulle priorità per risolvere i conflitti. Se in due database di sottoscrizione viene apportata una modifica in conflitto, ha la priorità la modifica del Sottoscrittore con la priorità di sottoscrizione più elevata. Nel caso in cui la priorità sia uguale, viene applicata per prima la modifica che raggiunge il server di pubblicazione. Con il rilevamento a livello di riga e di colonna, l'intera riga vincente sovrascrive sempre la riga perdente.

La proprietà articolo logical_record_level_conflict_resolution può essere impostata su TRUE o FALSE. Il valore dovrebbe essere impostato solo per l'articolo padre di primo livello e sarà ignorato dagli articoli figlio. Se il valore è impostato su TRUE, il record logico confermato sovrascrive interamente il record logico non confermato. Se è FALSE, le singole righe risultanti possono provenire da Sottoscrittori o Server di pubblicazione diversi. Ad esempio, il Sottoscrittore A può prevalere in un conflitto in una riga della tabella Orders , mentre il Sottoscrittore B può prevalere in una riga correlata nella tabella OrderItems . Il risultato è un record logico contenente la riga Orders del Sottoscrittore A e la riga OrderItems del Sottoscrittore B.

Interazione delle impostazioni di rilevamento e risoluzione dei conflitti

Il risultato dei conflitti dipende dall'interazione delle impostazioni di rilevamento e risoluzione dei conflitti. Negli esempi seguenti si presuppone l'utilizzo della risoluzione dei conflitti basata sulle priorità. Nel caso di record logici esistono le possibilità seguenti:

  • Rilevamento a livello di riga o di colonna, risoluzione a livello di riga

  • Rilevamento a livello di colonna, risoluzione del record logico

  • Rilevamento a livello di riga, risoluzione del record logico

  • Rilevamento del record logico, risoluzione del record logico

Rilevamento a livello di riga o di colonna, risoluzione a livello di riga

In questo esempio, la pubblicazione è configurata come segue:

  • column_tracking è TRUE o FALSE

  • logical_record_level_conflict_detection è impostata su FALSE

  • logical_record_level_conflict_resolution è FALSE

In questo caso, il rilevamento è a livello di riga o di colonna e la risoluzione è a livello di riga. Queste impostazioni consentono di replicare tutte le modifiche apportate a un record logico come singola unità, senza rilevare o risolvere conflitti a livello del record logico.

Rilevamento a livello di colonna, risoluzione dei record logici

In questo esempio, la pubblicazione è configurata come segue:

  • column_tracking è TRUE

  • logical_record_level_conflict_detection è impostata su FALSE

  • logical_record_level_conflict_resolution è impostata su TRUE

Un server di pubblicazione e un Sottoscrittore dispongono dello stesso set di dati iniziale e tra le tabelle orders e customers viene definito un record logico. Il server di pubblicazione modifica la colonna custcol1 della tabella customers e la colonna ordercol1 della tabella orders . Il Sottoscrittore modifica la stessa riga della colonna custcol1 nella tabella customers e la stessa riga della colonna ordercol2 nella tabella orders . Le modifiche apportate alla stessa colonna della tabella customers risultano in conflitto, mentre le modifiche apportate alla tabella orders non lo sono.

Poiché i conflitti vengono risolti a livello di record logico, le modifiche vincenti apportate nell'Editore sostituiscono le modifiche apportate nelle tabelle del Sottoscrittore durante l'elaborazione della replicazione.

Prima serie di tabelle che visualizzano le modifiche alle righe correlate.

Rilevamento a livello di riga, risoluzione del record logico

In questo esempio, la pubblicazione è configurata come segue:

  • column_tracking è FALSE

  • logical_record_level_conflict_detection è impostata su FALSE

  • logical_record_level_conflict_resolution è impostata su TRUE

Un server di pubblicazione e un Sottoscrittore dispongono dello stesso set di dati iniziale. Il server di pubblicazione modifica la colonna custcol1 della tabella customers . Il Sottoscrittore modifica la colonna custcol2 della tabella customers e la colonna ordercol2 della tabella orders. Le modifiche apportate alla stessa riga della tabella customers risultano in conflitto, mentre le modifiche apportate nel Sottoscrittore alla tabella orders non lo sono.

Poiché i conflitti vengono risolti a livello di record logico, durante la sincronizzazione le modifiche prevalenti apportate nell'Autore di pubblicazione sostituiscono le modifiche apportate nelle tabelle del Sottoscrittore.

Seconda serie di tabelle che visualizzano le modifiche alle righe correlate.

Rilevamento del record logico, risoluzione del record logico

In questo esempio, la pubblicazione è configurata come segue:

  • logical_record_level_conflict_detection è impostata su TRUE

  • logical_record_level_conflict_resolution è impostata su TRUE

Un server di pubblicazione e un Sottoscrittore dispongono dello stesso set di dati iniziale. Il server di pubblicazione modifica la colonna custcol1 della tabella customers . Il Sottoscrittore modifica la colonna ordercol1 della tabella orders . Non vi sono modifiche alla stessa riga o colonna. Tuttavia, dato che le modifiche sono state apportate allo stesso record logico per custid=1, le modifiche vengono rilevate come conflitto a livello dei record logici.

Poiché i conflitti vengono risolti anche a livello di record logico, durante la sincronizzazione la modifica risultata vincente apportata nel server di pubblicazione sostituisce la modifica apportata nelle tabelle del Sottoscrittore.

Terza serie di tabelle che visualizzano le modifiche alle righe correlate.