Konflikterkennung bei der Peer-zu-Peer-Replikation
Bei der Peer-zu-Peer-Transaktionsreplikation können Sie an einem beliebigen Knoten in der Topologie Daten einfügen, aktualisieren oder löschen, und Datenänderungen können an andere Knoten übermittelt werden. Da Sie Daten an einem beliebigen Knoten ändern können, können Datenänderungen an verschiedenen Knoten untereinander in Konflikt stehen. Wird eine Zeile an mehr als einem Knoten geändert, kann es zu einem Konflikt kommen, oder das Update kann sogar verloren gehen, wenn die Zeile an andere Knoten übermittelt wird.
Die Peer-zu-Peer-Replikation in SQL Server 2008 und höheren Versionen bietet die Möglichkeit, die Konflikterkennung in einer Peer-zu-Peer-Topologie zu aktivieren. Mithilfe dieser Option kann Problemen vorgebeugt werden, die durch nicht erkannte Konflikte, einschließlich inkonsistentem Verhalten von Anwendungen und verlorenen Updates, entstehen. Standardmäßig wird, wenn diese Option aktiviert ist, eine konfliktverursachende Änderung als ein schwerwiegender Fehler betrachtet, der zu einem Fehler des Verteilungs-Agents führt. Bei einem Konflikt verbleibt die Topologie so lange in einem inkonsistenten Zustand, bis der Konflikt gelöst und die Datenkonsistenz in der Topologie wiederhergestellt wurde.
Hinweis
Stellen Sie, um inkonsistente Daten zu vermeiden, in einer Peer-zu-Peer-Topologie sicher, dass keine Konflikte auftreten, auch wenn die Konflikterkennung aktiviert ist. Damit sichergestellt ist, dass Schreibvorgänge für eine bestimmte Zeile nur an einem Knoten durchgeführt werden, müssen Anwendungen, die auf Daten zugreifen und diese ändern, Einfügungen, Updates und Löschungen partitionieren. Diese Partitionierung gewährleistet, dass Änderungen an einer bestimmten Zeile, die von 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 ausgereifte Fähigkeiten zur Konflikterkennung und -lösung erfordert, verwenden Sie die Mergereplikation. Weitere Informationen finden Sie unter Mergereplikation und Erkennen und Beseitigen von Konflikten bei der Mergereplikation.
Grundlegendes zu Konflikten und der Konflikterkennung
In einer einzelnen Datenbank verursachen Änderungen, die von verschiedenen Anwendungen an derselben Zeile vorgenommen werden, keinen Konflikt. Der Grund dafür ist, dass Transaktionen serialisiert und gleichzeitige Änderungen mithilfe von Sperren behandelt werden. In einem asynchronen verteilten System wie der Peer-zu-Peer-Replikation agieren Transaktionen unabhängig voneinander auf jedem Knoten, und es gibt keinen Mechanismus dafür, Transaktionen über mehrere Knoten zu serialisieren. Ein Protokoll wie Zweiphasencommit könnte verwendet werden, aber dies hat deutliche Auswirkungen auf die Leistung.
In Systemen wie der Peer-zu-Peer-Replikation werden Konflikte nicht erkannt, wenn für Änderungen ein Commit auf einzelnen Peers ausgeführt wird. Sie werden erst erkannt, wenn diese Änderungen repliziert und auf anderen Peers übernommen werden. Bei der Peer-zu-Peer-Replikation werden Konflikte von den gespeicherten Prozeduren erkannt, die Änderungen an jedem Knoten übernehmen, und zwar basierend auf einer ausgeblendeten Spalte in jeder veröffentlichten Tabelle. In dieser ausgeblendeten Spalte ist eine ID gespeichert, die eine Absender-ID , die Sie für jeden Knoten angeben, mit der Version der Zeile kombiniert. Während der Synchronisierung führt der Verteilungs-Agent Prozeduren für jede Tabelle aus. Diese Prozeduren übernehmen Einfüge-, Update- und Löschvorgänge von anderen Peers. Wenn eine der Prozeduren beim Lesen des Werts der ausgeblendeten Spalte einen Konflikt erkennt, wird Fehler 22815 mit einem Schweregrad von 16 ausgelöst:
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 führt dieser Fehler dazu, dass der Verteilungs-Agent das Übernehmen von Änderungen für diesen Knoten beendet. Informationen zum Behandeln der erkannten Konflikte finden Sie unter "Konfliktbehandlung" weiter unten in diesem Thema.
Hinweis
Der Zugriff auf die ausgeblendete Spalte ist nur durch einen Benutzer möglich, der sich über die dedizierte Administratorverbindung (DAC) angemeldet hat. Weitere Informationen zu DAC finden Sie unter Diagnoseverbindung für Datenbankadministratoren.
Die Peer-zu-Peer-Replikation erkennt die folgenden Typen von Konflikten:
Insert-insert
Alle Zeilen in einer Tabelle, die an der Peer-zu-Peer-Replikation beteiligt sind, werden mithilfe von Primärschlüsselwerten eindeutig identifiziert. Ein Konflikt vom Typ "insert-insert" tritt auf, wenn eine Zeile mit demselben Schlüsselwert an mehreren Knoten eingefügt wurde.
Update-update
Tritt auf, wenn eine Zeile an mehreren Knoten aktualisiert wurde.
Insert-update
Tritt auf, wenn eine Zeile an einem Knoten aktualisiert wurde, diese Zeile aber gelöscht und dann an einem anderen Knoten erneut eingefügt wurde.
Insert-delete
Tritt auf, wenn eine Zeile an einem Knoten gelöscht wurde, diese Zeile aber gelöscht und dann an einem anderen Knoten erneut eingefügt wurde.
Update-delete
Tritt auf, wenn eine Zeile an einem Knoten aktualisiert wurde, diese Zeile aber an einem anderen Knoten gelöscht wurde.
Delete-delete
Tritt auf, wenn eine Zeile an mehreren Knoten gelöscht wurde.
Aktivieren der Konflikterkennung
Zur Verwendung der Konflikterkennung muss auf allen Knoten SQL Server 2008 oder eine höhere Version ausgeführt werden, 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, die Konflikterkennung auch in Szenarien zu aktivieren, in denen Sie keine Konflikte erwarten. Die Konflikterkennung kann mithilfe gespeicherter Prozeduren von Management Studio oder Transact-SQL aktiviert und deaktiviert werden:
Sie können die Konflikterkennung in Management Studio entweder auf der Seite Abonnementoptionen im Dialogfeld Veröffentlichungseigenschaften oder auf der Seite Topologie konfigurieren des Assistenten zum Konfigurieren der Peer-zu-Peer-Topologie aktivieren und deaktivieren.
Wenn Sie die Konflikterkennung mithilfe von Management Studiokonfigurieren, wird der Verteilungs-Agent so konfiguriert, dass er bei Erkennung eines Konflikts das Übernehmen von Änderungen beendet.
Sie können die Konflikterkennung 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 bei Erkennung eines Konflikts das Übernehmen von Änderungen beenden soll. Standardmäßig beendet der Agent diese Aufgabe. Es wird empfohlen, die Standardeinstellung zu verwenden.
Konfliktbehandlung
Wenn ein Konflikt in der Peer-zu-Peer-Replikation auftritt, wird die Peer-zu-Peer Konflikterkennungswarnung ausgelöst. Es wird empfohlen, diese Warnung so zu konfigurieren, dass Sie benachrichtigt werden, wenn ein Konflikt auftritt. Weitere Informationen über Warnungen finden Sie unter Verwenden von Warnungen für Replikations-Agentereignisse.
Verwenden Sie eine der folgenden Vorgehensweisen, um den aufgetretenen Konflikt zu behandeln, nachdem der Verteilungs-Agent beendet und die Warnung ausgelöst wurde:
Initialisieren Sie den Knoten, an dem der Konflikt erkannt wurde, erneut aus der Sicherung eines Knotens, der die erforderlichen Daten aufweist (empfohlene Vorgehensweise). Mithilfe dieser Methode wird sichergestellt, dass sich die Daten in einem konsistenten Status befinden.
Versuchen Sie, den Knoten wieder zu synchronisieren, indem Sie den Verteilungs-Agent aktivieren, damit dieser das Übernehmen von Änderungen fortsetzt:
Führen Sie sp_changepublication aus: Geben Sie "p2p_continue_onconflict" für den @property Parameter und
true
für den @value Parameter an.Starten Sie den Verteilungs-Agent neu.
Überprüfen Sie die erkannten Konflikte im Konflikt-Viewer, und bestimmen Sie die beteiligten Zeilen, den Konflikttyp und den Gewinner. Der Konflikt wird anhand des Werts der Absender-ID aufgelöst, den Sie während der Konfiguration angegeben haben: Die Zeile, die von dem Knoten mit der höchsten ID stammt, gewinnt den Konflikt. Weitere Informationen finden Sie unter Anzeigen von Datenkonflikten für Transaktionsveröffentlichungen (SQL Server Management Studio).
Führen Sie eine Überprüfung aus, um sicherzustellen, dass die miteinander in Konflikt stehenden Zeilen ordnungsgemäß konvergiert wurden. Weitere Informationen finden Sie unter Überprüfen von replizierten Daten.
Hinweis
Wenn die Daten nach Ausführung dieses Schritts inkonsistent sind, müssen Sie die Zeilen auf dem Knoten mit der höchsten Priorität manuell aktualisieren und dann die Änderungen von diesem Knoten übertragen. Wenn die Topologie keine weiteren miteinander in Konflikt stehenden Änderungen aufweist, werden alle Knoten in einen konsistenten Status gebracht.
Führen Sie sp_changepublication aus: Geben Sie "p2p_continue_onconflict" für den @property Parameter und
false
für den @value Parameter an.