Freigeben über


Konflikterkennung in Peer-to-Peer-Replikation

Mit der Peer-to-Peer-Transaktionsreplikation können Sie Daten an einem beliebigen Knoten in einer Topologie einfügen, aktualisieren oder löschen und Datenänderungen an die anderen Knoten weitergeben lassen. Da Sie Daten an einem beliebigen Knoten ändern können, können Datenänderungen an verschiedenen Knoten miteinander in Konflikt stehen. Wenn eine Zeile an mehreren Knoten geändert wird, kann dies zu einem Konflikt oder sogar zu einer verlorenen Aktualisierung führen, wenn die Zeile an andere Knoten weitergegeben wird.

Peer-to-Peer-Replikation in SQL Server 2008 und höheren Versionen bietet die Möglichkeit, die Konflikterkennung über eine Peer-to-Peer-Topologie hinweg zu aktivieren. Diese Option würde dazu beitragen, die Probleme zu verhindern, die durch nicht erkannte Konflikte verursacht werden, einschließlich inkonsistenter Anwendungsverhalten und verloren gegangener Updates. Wenn diese Option aktiviert ist, wird standardmäßig eine widersprüchliche Änderung als kritischer Fehler behandelt, der den Fehler des Verteilungs-Agents verursacht. Im Falle eines Konflikts verbleibt die Topologie in einem inkonsistenten Zustand, bis der Konflikt aufgelöst wird und die Daten in der gesamten Topologie konsistent sind.

Hinweis

Um potenzielle Dateninkonsistenzen zu vermeiden, stellen Sie sicher, dass Konflikte in einer Peer-to-Peer-Topologie vermieden werden, auch wenn die Konflikterkennung aktiviert ist. Um sicherzustellen, dass Schreibvorgänge für eine bestimmte Zeile nur auf einem Knoten ausgeführt werden, müssen Anwendungen, die auf Daten zugreifen und diese ändern, die Einfüge-, Aktualisierungs- und Löschvorgänge partitionieren und verwalten. Diese Partitionierung stellt sicher, dass Änderungen an einer bestimmten Zeile, die an einem Knoten stammt, mit allen anderen Knoten in der Topologie synchronisiert werden, bevor die Zeile von einem anderen Knoten geändert wird. Wenn eine Anwendung komplexe Konflikterkennungs- und Lösungsfähigkeiten erfordert, verwenden Sie die Zusammenführungsreplikation. Weitere Informationen finden Sie unter Merge Replication and Detect and Resolve Merge Replication Conflicts.

Grundlegendes zu Konflikten und Konflikterkennung

In einer einzelnen Datenbank verursachen Änderungen, die an derselben Zeile durch verschiedene Anwendungen vorgenommen werden, keinen Konflikt. Dies liegt daran, dass Transaktionen serialisiert werden und Sperren verwendet werden, um gleichzeitige Änderungen zu verarbeiten. In einem asynchronen verteilten System wie peer-to-Peer-Replikation agieren Transaktionen unabhängig auf jedem Knoten; und es gibt keinen Mechanismus zum Serialisieren von Transaktionen über mehrere Knoten. Ein Protokoll wie ein Zwei-Phasen-Commit kann verwendet werden, dies wirkt sich jedoch erheblich auf die Leistung aus.

In Systemen wie der Peer-to-Peer-Replikation werden Konflikte nicht erkannt, wenn Änderungen bei einzelnen Peers übernommen werden. Stattdessen werden sie erkannt, wenn diese Änderungen repliziert und auf andere Peers angewendet werden. Bei der Peer-zu-Peer-Replikation werden Konflikte durch die gespeicherten Prozeduren erkannt, die Änderungen auf jeden Knoten anwenden, basierend auf einer ausgeblendeten Spalte in jeder veröffentlichten Tabelle. Diese ausgeblendete Spalte speichert eine ID, die eine Absender-ID kombiniert, die Sie für jeden Knoten und die Version der Zeile angeben. Während der Synchronisierung führt der Verteilungs-Agent Prozeduren für jede Tabelle aus. Diese Prozesse gelten für Einfüge-, Aktualisierungs- und Löschvorgänge von anderen Peers. Wenn eine der Prozeduren einen Konflikt erkennt, wenn er den ausgeblendeten Spaltenwert liest, löst sie Fehler 22815 aus, deren Schweregrad 16 beträgt:

A conflict of type '%s' was detected at peer %d between peer %d (incoming), transaction id %s and peer %d (on disk), transaction id %s

Standardmäßig bewirkt dieser Fehler, dass der Verteilungs-Agent die Anwendung von Änderungen auf diesen Knoten beendet. Informationen zur Behandlung der erkannten Konflikte finden Sie weiter unten in diesem Thema unter "Behandeln von Konflikten".

Hinweis

Auf die ausgeblendete Spalte kann nur von einem Benutzer zugegriffen werden, der über die dedizierte Administratorverbindung (DAC) angemeldet ist. Informationen zu DAC finden Sie unter Diagnoseverbindung für Datenbankadministratoren.

Peer-to-Peer-Replikation erkennt die folgenden Arten von Konflikten:

  • Einfügen-Einfügen

    Alle Zeilen in jeder Tabelle, die an der Peer-to-Peer-Replikation teilnehmen, werden mithilfe von Primärschlüsselwerten eindeutig identifiziert. Ein Einfügekonflikt tritt auf, wenn eine Zeile mit demselben Schlüsselwert an mehreren Knoten eingefügt wurde.

  • Aktualisierung-Aktualisierung

    Tritt auf, wenn die gleiche Zeile bei mehr als einem Knoten aktualisiert wurde.

  • Einfügen-Aktualisieren

    Tritt auf, wenn eine Zeile auf einem Knoten aktualisiert wurde, aber die gleiche Zeile gelöscht und dann an einem anderen Knoten erneut eingefügt wurde.

  • Einfügen-Löschen

    Tritt auf, wenn eine Zeile an einem Knoten gelöscht wurde, aber dieselbe Zeile gelöscht und dann an einem anderen Knoten erneut eingefügt wurde.

  • Aktualisieren und löschen

    Tritt auf, wenn eine Zeile auf einem Knoten aktualisiert wurde, aber dieselbe Zeile an einem anderen Knoten gelöscht wurde.

  • Löschen

    Tritt auf, wenn eine Zeile bei mehr als einem Knoten gelöscht wurde.

Aktivieren der Konflikterkennung

Um die Konflikterkennung zu verwenden, müssen alle Knoten SQL Server 2008 oder eine höhere Version ausführen. und die Erkennung muss für alle Knoten aktiviert sein. In SQL Server 2008 und höheren Versionen ist die Konflikterkennung standardmäßig in SQL Server Management Studio aktiviert. Es wird empfohlen, dass die Erkennung aktiviert ist, auch in Szenarien, in denen Sie keine Konflikte erwarten. Die Konflikterkennung kann mithilfe von Management Studio oder Transact-SQL gespeicherten Prozeduren aktiviert und deaktiviert werden:

  • Sie können die Erkennung in Management Studio entweder über die Seite " Abonnementoptionen " des Dialogfelds " Publikationseigenschaften " oder über die Seite " Topologie konfigurieren " des Assistenten zum Konfigurieren der Peer-to-Peer-Topologie aktivieren und deaktivieren.

    Wenn Sie die Konflikterkennung mithilfe von Management Studio konfigurieren, wird der Verteilungs-Agent so konfiguriert, dass die Anwendung von Änderungen beendet wird, wenn ein Konflikt erkannt wird.

  • Sie können die Erkennung auch mithilfe der folgenden gespeicherten Prozeduren aktivieren und deaktivieren: sp_addpublication oder sp_configure_peerconflictdetection.

    Wenn Sie die Konflikterkennung mithilfe gespeicherter Prozeduren konfigurieren, können Sie angeben, ob der Verteilungs-Agent die Anwendung von Änderungen beenden soll, wenn ein Konflikt erkannt wird. Der Standardwert ist, dass der Agent beendet wird. Es wird empfohlen, die Standardeinstellung zu verwenden.

Behandeln von Konflikten

Wenn ein Konflikt in der Peer-zu-Peer-Replikation auftritt, wird die Warnung zur Erkennung von Peer-to-Peer-Konflikten ausgelöst. Es wird empfohlen, diese Warnung so zu konfigurieren, dass Sie benachrichtigt werden, wenn ein Konflikt auftritt. Weitere Informationen zu Warnungen finden Sie unter Verwenden von Warnungen für Replikations-Agent-Ereignisse.

Nachdem der Distributions-Agent beendet wurde und die Warnung ausgelöst ist, verwenden Sie einen der folgenden Ansätze, um die aufgetretenen Konflikte zu behandeln.

  • Initialisieren Sie den Knoten, an dem der Konflikt festgestellt wurde, erneut aus der Sicherung eines Knotens, der die erforderlichen Daten enthält (empfohlener Ansatz). Mit dieser Methode wird sichergestellt, dass sich Daten in einem konsistenten Zustand befinden.

  • Versuchen Sie, den Knoten erneut zu synchronisieren, indem Sie den Verteilungs-Agent aktivieren, um weiterhin Änderungen anzuwenden:

    1. Führen Sie sp_changepublication aus: Geben Sie 'p2p_continue_onconflict' für den @property Parameter und true für den @value Parameter an.

    2. Starten Sie den Verteilungs-Agent neu.

    3. Überprüfen Sie die Konflikte, die mithilfe der Konfliktanzeige erkannt wurden, und bestimmen Sie die Zeilen, die beteiligt waren, den Typ des Konflikts und den Gewinner. Der Konflikt wird basierend auf dem Absender-ID-Wert behoben, den Sie während der Konfiguration angegeben haben: Die Zeile, die am Knoten mit der höchsten ID stammt, gewinnt den Konflikt. Weitere Informationen finden Sie unter Anzeigen von Datenkonflikten für Transaktionspublikationen (SQL Server Management Studio).

    4. Führen Sie die Überprüfung aus, um sicherzustellen, dass die in Konflikt stehenden Zeilen ordnungsgemäß zusammengeführt wurden. Weitere Informationen finden Sie unter Überprüfen replizierter Daten.

      Hinweis

      Wenn Daten nach diesem Schritt inkonsistent sind, müssen Sie Zeilen auf dem Knoten, der die höchste Priorität hat, manuell aktualisieren und dann die Änderungen von diesem Knoten weitergeben lassen. Wenn es keine weiteren widersprüchlichen Änderungen in der Topologie gibt, werden alle Knoten in einen konsistenten Zustand gebracht.

    5. Führen Sie sp_changepublication aus: Geben Sie 'p2p_continue_onconflict' für den @property Parameter und false für den @value Parameter an.

Siehe auch

Peer-to-Peer-Transaktionsreplikation