Erweiterte Konflikte in Mergereplikationen – Lösen von Konflikten in logischen DatensätzenAdvanced Merge Replication Conflict - Resolving in Logical Record

Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions) Anwendungsbereich:Applies to: JaSQL ServerSQL Server (alle unterstützten Versionen) yesSQL ServerSQL Server (all supported versions)

In diesem Thema werden die verschiedenen Kombinationsmöglichkeiten aus Konflikterkennung und Konfliktlösung bei der Verwendung logischer Datensätze behandelt.This topic covers the various combinations of conflict detection and conflict resolution approaches possible when using logical records. Konflikte treten bei der Mergereplikation auf, wenn ein und dieselben Daten von mehreren Knoten geändert werden oder wenn die Mergereplikation auf bestimmte Arten von Fehlern stößt, wie z. B. Einschränkungsverletzungen beim Replizieren von Änderungen.A conflict in merge replication occurs when more than one node changes the same data, or merge replication encounters certain types of errors, such as a constraint violation, when replicating changes. Weitere Informationen zur Konflikterkennung und -lösung finden Sie unter Advanced Merge Replication Conflict Detection and Resolution.For more information about conflict detection and resolution, see Advanced Merge Replication Conflict Detection and Resolution.

Informationen zum Angeben der Konfliktnachverfolgungs- und -lösungsebene für einen Artikel finden Sie unter Modify Merge Replication options (Ändern von Mergereplikationsoptionen).To specify the conflict tracking and resolution level for an article, see Modify Merge Replication options.

KonflikterkennungConflict Detection

Wie Konflikte bei logischen Datensätzen ermittelt werden, hängt von den folgenden beiden Artikeleigenschaften ab: column_tracking und logical_record_level_conflict_detection.The way in which conflicts are detected for logical records is determined by two article properties: column_tracking and logical_record_level_conflict_detection. SQL Server 2005 (9.x)SQL Server 2005 (9.x) und höhere Versionen unterstützen ebenfalls die Erkennung auf der logischen Datensatzebene.and later versions also support logical record-level detection.

Für die logical_record_level_conflict_detection -Artikeleigenschaft kann TRUE oder FALSE festgelegt werden.The logical_record_level_conflict_detection article property can be set to TRUE or FALSE. Der Wert sollte nur für den übergeordneten Artikel auf der obersten Ebene festgelegt werden. Von den untergeordneten Artikeln wird er ignoriert.The value should only be set for the top-level parent article and will be ignored by child articles. Wenn FALSE festgelegt wurde, erfolgt die Konflikterkennung durch die Mergereplikation wie in den früheren Versionen von SQL ServerSQL Server, d. h. ausschließlich auf der Basis des Werts der column_tracking -Eigenschaft für den Artikel.If this value is FALSE, merge replication detects conflicts as in previous versions of SQL ServerSQL Server, based solely on the value of the column_tracking property for the article. Wurde TRUE festgelegt, ignoriert die Mergereplikation die column_tracking -Eigenschaft für den Artikel und ermittelt einen Konflikt, wenn Änderungen im logischen Datensatz vorgenommen werden.If this value is TRUE, merge replication will ignore the column_tracking property of the article, and detect a conflict if changes are made anywhere in the logical record. Stellen Sie sich z. B. das folgende Szenario vor:For example, consider this scenario:

Logischer Datensatz für drei Tabellen mit WertenThree table logical record with values

Ein Konflikt wird erkannt, wenn zwei Benutzer Werte für den logischen Customer2-Datensatz in den Customers -, Orders - bzw. OrderItems -Tabellen ändern.A conflict is detected if two users change any values for the Customer2 logical record in the Customers , Orders , or OrderItems tables. Bei diesem Beispiel kommt es zu Änderungen durch eine UPDATE-Anweisung, der Konflikt würde aber auch erkannt werden, wenn die Änderungen durch eine INSERT- oder DELETE-Anweisung zustande gekommen wären.This example involves changes made via an UPDATE statement, but the conflict can also be detected by changes made with INSERT or DELETE statements.

KonfliktlösungConflict Resolution

Standardmäßig verwendet die Mergereplikation zum Lösen von Konflikten eine prioritätsbasierte Logik.By default, merge replication uses priority-based logic to resolve conflicts. Wenn eine Änderung, die zu einem Konflikt führt, in zwei Abonnentendatenbanken vorgenommen wird, hat die Änderung für den Abonnenten mit der höheren Abonnementpriorität Vorrang. Ist die Priorität bei beiden Abonnements identisch, erhält die Änderung den Vorzug, die den Verleger zuerst erreicht.If a conflicting change is made in two Subscriber databases, the change for the Subscriber with the higher subscription priority wins, or if the priority is the same, the first change to reach the Publisher wins. Bei der Erkennung auf Zeilen- und Spaltenebene wird die unterlegene Zeile immer durch die gesamte Gewinnerzeile überschrieben.With row-level and column-level detection, the entire winning row always overwrites the losing row.

Für die logical_record_level_conflict_resolution -Artikeleigenschaft kann TRUE oder FALSE festgelegt werden.The logical_record_level_conflict_resolution article property can be set to TRUE or FALSE. Der Wert sollte nur für den übergeordneten Artikel auf der obersten Ebene festgelegt werden. Von den untergeordneten Artikeln wird er ignoriert.The value should only be set for the top-level parent article and will be ignored by child articles. Wenn für den Wert TRUE festgelegt wird, wird der unterlegene logische Datensatz durch den gesamten gewinnenden logischen Datensatz überschrieben.If the value is TRUE, the entire winning logical record overwrites the losing logical record. Wenn für den Wert FALSE festgelegt wird, können die einzelnen Gewinnerzeilen von unterschiedlichen Abonnenten oder Verlegern stammen.If it is FALSE, individual winning rows can come from different Subscribers or Publishers. So könnte z. B. Abonnent A einen Konflikt in einer Zeile aus der Orders -Tabelle und Abonnent B einen Konflikt in einer zugehörigen Zeile aus der OrderItems -Tabelle gewinnen.For example, Subscriber A could win a conflict on a row from the Orders table, and Subscriber B could win on a related row from the OrderItems table. Im Ergebnis entsteht ein logischer Datensatz mit der Orders -Zeile von Abonnent A und der OrderItems -Zeile von Abonnent B.The result is a logical record with the Orders row from Subscriber A and the OrderItems row from Subscriber B.

Wechselwirkung zwischen den Einstellungen für die Konfliktlösung und denen für die KonflikterkennungInteraction of Conflict Resolution and Detection Settings

Zu welchem Ergebnis Konflikte führen, hängt von der Wechselwirkung zwischen den Konflikterkennungs- und den Konfliktlösungseinstellungen ab.The outcome of conflicts depends on the interaction of conflict detection and resolution settings. In den Beispielen unten wird davon ausgegangen, dass eine prioritätsbasierte Konfliktlösung zur Anwendung kommt.For the examples below, it is assumed that the priority-based conflict resolution is being used. Bei der Verwendung logischer Datensätze gibt es folgende Möglichkeiten:When using logical records, the possibilities are:

  • Erkennung auf Zeilen- oder Spaltenebene, Lösung auf ZeilenebeneRow or column level detection, row level resolution

  • Erkennung auf Spaltenebene, Lösung auf der Ebene des logischen DatensatzesColumn level detection, logical record resolution

  • Erkennung auf Zeilenebene, Lösung auf der Ebene des logischen DatensatzesRow level detection, logical record resolution

  • Erkennung auf der Ebene des logischen Datensatzes, Lösung auf der Ebene des logischen DatensatzesLogical record detection, logical record resolution

Erkennung auf Zeilen- oder Spaltenebene, Lösung auf ZeilenebeneRow or Column Level Detection, Row Level Resolution

In diesem Beispiel ist die Veröffentlichung wie folgt konfiguriert:In this example, the publication is configured with:

  • Für column_tracking ist TRUE oder FALSE festgelegt.column_tracking is TRUE or FALSE

  • Für logical_record_level_conflict_detection ist FALSE festgelegt.logical_record_level_conflict_detection is FALSE

  • Für logical_record_level_conflict_resolution ist FALSE festgelegt.logical_record_level_conflict_resolution is FALSE

In diesem Fall erfolgt die Erkennung auf der Zeilen- oder Spaltenebene, und die Lösung erfolgt auf der Zeilenebene.In this case, detection is at the row or column level and resolution is at the row level. Diese Einstellungen werden verwendet, um davon zu profitieren, dass alle Änderungen eines logischen Datensatzes als Einheit repliziert werden, ohne dass dazu eine Konflikterkennung oder -lösung auf der Ebene des logischen Datensatzes erfolgt.These settings are used to take advantage of having all changes to a logical record replicate as a unit, but without conflict detection or resolution at the logical record level.

Erkennung auf Spaltenebene, Lösung auf der Ebene des logischen DatensatzesColumn Level Detection, Logical Record Resolution

In diesem Beispiel ist die Veröffentlichung wie folgt konfiguriert:In this example, the publication is configured with:

  • Für column_tracking ist TRUE festgelegt.column_tracking is TRUE

  • Für logical_record_level_conflict_detection ist FALSE festgelegt.logical_record_level_conflict_detection is FALSE

  • Für logical_record_level_conflict_resolution ist TRUE festgelegt.logical_record_level_conflict_resolution is TRUE

Ein Verleger und ein Abonnent beginnen mit demselben Datensatz, und zwischen den orders - und customers -Tabellen ist ein logischer Datensatz definiert.A Publisher and Subscriber start with the same data set, and a logical record is defined between the orders and customers tables. Der Verleger ändert die custcol1 -Spalte in der customers -Tabelle und die ordercol1 -Spalte in der orders -Tabelle.The Publisher changes the custcol1 column in the customers table and the ordercol1 in the orders table. Der Abonnent ändert die custcol1 -Spalte in derselben Zeile der customers -Tabelle und die ordercol2 -Spalte in derselben Zeile der orders -Tabelle.The Subscriber changes custcol1 in the same row of the customers table and the ordercol2 column in the same row of the orders table. Die Änderungen an derselben Spalte in der customer -Tabelle führen zu einem Konflikt, aus den Änderungen an der orders -Tabelle ergibt sich jedoch kein Konflikt.The changes to the same column in the customer table result in a conflict, but the changes to the orders table are not in conflict.

Da die Konflikte auf der Ebene des logischen Datensatzes gelöst werden, ersetzen während der Replikationsverarbeitung die Gewinneränderungen, die auf dem Verleger vorgenommen wurden, die Änderungen, die an den Tabellen auf dem Abonnenten erfolgt sind.Because the conflicts are resolved at the logical record level, the winning changes made at the Publisher replace the changes made in the Subscriber tables during replication processing.

Erste Reihe von Tabellen mit Änderungen an verknüpften ZeilenFirst series of tables showing changes to related rows.

Erkennung auf Zeilenebene, Lösung auf der Ebene des logischen DatensatzesRow Level Detection, Logical Record Resolution

In diesem Beispiel ist die Veröffentlichung wie folgt konfiguriert:In this example, the publication is configured with:

  • Für column_tracking ist FALSE festgelegt.column_tracking is FALSE

  • Für logical_record_level_conflict_detection ist FALSE festgelegt.logical_record_level_conflict_detection is FALSE

  • Für logical_record_level_conflict_resolution ist TRUE festgelegt.logical_record_level_conflict_resolution is TRUE

Ein Verleger und ein Abonnent beginnen mit demselben Datensatz.A Publisher and Subscriber start with the same data set. Der Verleger ändert die custcol1 -Spalte in der customers -Tabelle.The Publisher changes the custcol1 column in the customers table. Der Abonnent ändert die custcol2 -Spalte in der customers -Tabelle und die ordercol2 -Spalte in der orders -Tabelle.The Subscriber changes custcol2 in the customers table and the ordercol2 column in the orders table. Die Änderungen an derselben Spalte in der customers -Tabelle führen zu einem Konflikt, während sich aus den Änderungen des Abonnenten an der orders -Tabelle kein Konflikt ergibt.The changes to the same row in the customers table result in a conflict, but the Subscriber changes to the orders table are not in conflict.

Da die Konflikte auf der Ebene des logischen Datensatzes gelöst werden, ersetzen während der Synchronisierung die Gewinneränderungen, die auf dem Verleger vorgenommen wurden, die Änderungen, die an den Tabellen auf dem Abonnenten erfolgt sind.Because the conflicts are resolved at the logical record level, during synchronization the winning changes made at the Publisher replace the changes made in the Subscriber tables.

Zweite Reihe von Tabellen mit Änderungen an verknüpften ZeilenSecond series of tables showing changes to related rows.

Erkennung auf der Ebene des logischen Datensatzes, Lösung auf der Ebene des logischen DatensatzesLogical Record Detection, Logical Record Resolution

In diesem Beispiel ist die Veröffentlichung wie folgt konfiguriert:In this example, the publication is configured with:

  • Für logical_record_level_conflict_detection ist TRUE festgelegt.logical_record_level_conflict_detection is TRUE

  • Für logical_record_level_conflict_resolution ist TRUE festgelegt.logical_record_level_conflict_resolution is TRUE

Ein Verleger und ein Abonnent beginnen mit demselben Datensatz.A Publisher and Subscriber start with the same data set. Der Verleger ändert die custcol1 -Spalte in der customers -Tabelle.The Publisher changes the custcol1 column in the customers table. Der Abonnent ändert die ordercol1 -Spalte in der orders -Tabelle.The Subscriber changes the ordercol1 column in the orders table. Es sind keine Änderungen an identischen Zeilen oder Spalten vorgenommen worden, da aber die Änderungen für custid =1 im selben logischen Datensatz erfolgt sind, werden die Änderungen auf der Ebene des logischen Datensatzes als Konflikt erkannt.There are no changes to the same row or columns, but because the changes are made in the same logical record for custid =1, the changes are detected as a conflict at the logical record level.

Da die Konflikte auch auf der Ebene des logischen Datensatzes gelöst werden, ersetzt während der Synchronisierung die Gewinneränderung, die auf dem Verleger vorgenommen wurde, die Änderung, die an den Tabellen auf dem Abonnenten erfolgt ist.Because the conflicts are also resolved at the logical record level, during synchronization the winning change made at the Publisher replaces the change made in the Subscriber tables.

Dritte Reihe von Tabellen mit Änderungen an verknüpften ZeilenThird series of tables showing changes to related rows.

Weitere InformationenSee Also

Gruppieren von Änderungen an verknüpften Zeilen mithilfe von logischen DatensätzenGroup Changes to Related Rows with Logical Records