Jak replikacja łączenia wykrywa i usuwa konflikty

replikacja łączenia pozwala wielu węzłów dokonywanie zmian danych autonomicznych, więc istnieją sytuacje, dokonywane zmiany w jednym z węzłów może być w konflikcie z zmiany wprowadzone do tych samych danych w innym węźle.W innych sytuacjach Agent Scal wystąpi błąd, takie jak naruszenie ograniczenia i nie może propagować zmiany dokonane w określonym węźle do innego węzła.W tym temacie opisano typy powoduje konflikt, w jaki sposób konflikty są wykrywane i rozwiązywane i czynników, która wpływa na wykrywanie i rozdzielczości.

Wykrywanie i rozwiązywanie konfliktów

Agent Scal wykryje konflikt przy użyciu rodowodu kolumnaMSmerge_contents systemowej tabela; Jeśli śledzenie poziom kolumna jest włączona dla artykuł, COLV1 kolumna jest również używany.Te kolumna zawierają metadane dotyczące wiersza lub kolumna jest wstawiany lub aktualizowany i węzły, które w replikacja łączenia informacje o topologii wprowadzone zmiany do wiersza lub kolumna.systemowa procedura składowana sp_showrowreplicainfo (Transact-SQL) Aby wyświetlić te metadane.

Jak scalanie Agent wylicza zmiany mają być stosowane podczas synchronizacji, porównuje metadane dla każdego wiersza Wydawca i subskrybent.Scal agent używa tych metadane do ustalenia, czy wiersz lub kolumna zmienił się na więcej niż jeden węzeł w topologii wskazuje potencjalnego konfliktu.Po wykryciu konflikt, Agent korespondencji seryjnej spowoduje uruchomienie programu mechanizm rozwiązywania konfliktów dla artykuł z konflikt i używa program rozpoznawania nazw w celu określenia zwycięzcy konfliktu.Wydawca i subskrybent stosowany jest wygrywający wiersz, a dane z wierszy przegrywająca są zapisywane do tabela konfliktów.

Konflikty są rozwiązywane automatycznie i bezpośrednio przez agenta korespondencji seryjnej, chyba że wybrany został rozwiązywania konfliktów interaktywne artykuł.Aby uzyskać więcej informacji zobacz Interakcyjne rozpoznawanie konfliktów. Jeśli użytkownik ręcznie zmienia wygrywający wiersz konflikt przy użyciu replikacja łączenia Podgląd konfliktów Agent seryjna dotyczy wersja wygrywający wiersz przegrywająca serwera podczas następnej synchronizacji.

Rejestrowanie rozwiązać konflikty

Po Agent korespondencji seryjnej ma rozwiązać konflikt zgodnie z logikę rozpoznawania konflikt nazw, rejestruje konfliktu danych zgodnie z typem konflikt:

  • Konflikty UPDATE i INSERT zapisuje przegrywająca wersja wiersza do tabela konfliktów w artykule o nazwie w postaci conflict_<PublicationName>_<ArticleName>. Informacje ogólne konfliktu, takie jak typ konfliktu, są zapisywane w tabela MSmerge_conflicts_info.

  • Konflikty DELETE zapisuje przegrywająca wersja wiersza do MSmerge_conflicts_info tabela.Gdy usunięcia traci przed aktualizacji, brak danych dla wiersza przegrywająca (ponieważ było usunięcia), więc nie są zapisywane do conflict_<PublicationName>_<ArticleName>.

Tabele konfliktów dla każdego artykuł są tworzone w bazie danych publikacja, baza danych subskrypcja lub obu (wartość domyślna), w zależności od wartości określone dla @ conflict_logging parametrsp_addmergepublication.Każda tabela konflikt ma taką samą strukturę jak artykuł, na którym jest on oparty, z uwzględnieniem origin_datasource_id kolumna.Agent Scalanie usuwa dane z tabela konfliktów, jeżeli jest starsza niż okres zachowywania konflikt w publikacja, która jest określana przy użyciu @ conflict_retention parametrsp_addmergepublication (wartość domyślna to 14 dni).

Replikacja zapewnia Podgląd konfliktów replikacji i (procedury przechowywanesp_helpmergearticleconflicts, sp_helpmergeconflictrows, and sp_helpmergedeleteconflictrows) Aby wyświetlić konfliktu danych.Aby uzyskać więcej informacji zobacz Jak Służy do wyświetlania i rozwiązać konflikty danych w publikacji seryjnej (SQL Server Management Studio) i Jak Wyświetlanie konfliktów informacji zawartych w publikacji seryjnej (Programowanie replikacja języka Transact-SQL).

Czynniki to rozwiązanie konfliktów mają wpływ na

Istnieją dwa czynniki, które wpływają na sposób usuwa agenta korespondencji seryjnej, a konflikt go wykrył:

  • Typ subskrypcja: klient lub serwer (subskrypcji jest, czy subskrypcja wciągana subskrypcja wypychana nie ma wpływu na rozwiązywanie konfliktów).

  • Typ śledzenia konfliktów używany: na poziomie wiersza, kolumna poziom lub logicznych poziomie rekordu.

Typy subskrypcja

When you create a subscription, in addition to specifying whether it is a push or pull subscription, you specify whether it is a client or server subscription; after a subscription is created, the type cannot be changed (in previous versions of Microsoft SQL Server, client and server subscriptions were referred to, respectively, as local and global subscriptions).

Subskrypcja o wartości priorytetu przypisanej (od 0,00 do 99.99) nosi nazwę subskrypcja serwerowa; subskrypcji przy użyciu wartości priorytetu równej Wydawca nosi nazwę subskrypcja kliencka.Ponadto subskrybentów z subskrypcjami serwera można opublikować ponownie dane innych subskrybentów.W poniższej tabela zestawiono główne różnice i korzysta z każdego typu subskrybent.

Typ

Wartość priorytetu

Używane

Serwer

Przypisany przez użytkownika

Kiedy ma różne subskrybentów mają różne priorytety.

Klient

wartość 0, ale zmiany danych przyjmuje wartości priorytetu równej Wydawca po synchronizacji

Kiedy ma wszystkich subskrybent mają ten sam priorytet, a pierwszy subskrybent do scalenia z programem Wydawca, aby wygrać konfliktu.

Jeśli wiersz zostanie zmieniona w klient subskrypcja, nie priorytet jest przypisywana do zmiany subskrypcja jest synchronizowany.Podczas synchronizacji zmian wprowadzonych przez subskrybent przypisano priorytet Wydawca i zachować tym priorytet dla kolejnych synchronizacji.W tym sensie Wydawca przejmuje zmianę.To zachowanie umożliwia subskrybent pierwszej synchronizacji z programem Wydawca, aby wygrać kolejnych powoduje konflikt z innymi subskrybent dla danego wiersza lub kolumna.

Zmiana wiersza w subskrypcja serwerowa priorytet subskrypcji są przechowywane metadane dla zmiany.Ta wartość priorytetu podróżuje z zmienionych wierszy go scalaniu zmian w innych subskrybentów.Gwarantuje to, że zmiany wprowadzone przez wyższy priorytet subskrypcja nie utraci kolejne zmiany wprowadzone przez subskrypcja z niższym priorytetem.

Subskrypcja nie może mieć wartość jawne priorytet wyższy niż jego Wydawca.Wydawca najwyższego poziom w topologii replikacja łączenia ma zawsze 100,00, którego wartość priorytetu jawne.Wszystkie subskrypcje do tej publikacja musi mieć wartość priorytetu poniżej tej wartości.W topologii republishing:

  • subskrybent jest publikowany ponownie danych, subskrypcji musi być subskrypcja serwerowa z wartością pierwszeństwa mniej niż Wydawca powyżej subskrybent.

  • Jeśli subskrybent jest publikowany nie ponownie dane (ponieważ jest on poziom liść drzewa republishing), subskrypcji musi być subskrypcja kliencka.

Aby uzyskać więcej informacji na temat subskrypcji serwera i priorytetów zobacz Przykład rozwiązanie konfliktów korespondencji seryjnej zgodnie z subskrypcja typ i właściwości przypisanych.

Opóźnienia powiadomienie konfliktów

Powiadomienie opóźnione konflikt może wystąpić z subskrypcjami serwera, zawierające różne konflikt priorytetów.Rozważmy następujący scenariusz, w którym bezkonfliktowe zmiany są wymieniane między wydawcę i subskrybent niższym priorytecie, które są wynikiem zmian powodujących konflikty subskrybent wyższy priorytet synchronizacji z Wydawca:

  1. Wydawca Oraz na wymianę subskrybent o nazwie LowPrioritySub niskim priorytecie zmian przez kilka synchronizacji bez konfliktu.

  2. Subskrybent o wyższym priorytecie, o nazwie HighPrioritySub, nie został zsynchronizowany z Wydawca w niektórych czas i wprowadziła zmiany w tych samych wierszy, które wprowadził subskrybenta LowPrioritySub.

  3. Subskrybent HighPrioritySub synchronizuje z Wydawca i konflikty między swoje zmiany i subskrybenta LowPrioritySub wins, ponieważ ma wyższy priorytet niż subskrybenta LowPrioritySub.Wydawca zawiera teraz zmiany wprowadzone przez subskrybent HighPrioritySub.

  4. Subskrybent LowPrioritySub łączy się następnie z Wydawca i pliki do pobrania dużej liczby zmian z powodu konfliktów z HighPrioritySub subskrybenta.

Taka sytuacja może być problematyczne w subskrybent niższym priorytecie wprowadziła zmiany w tych samych wierszy, które są obecnie losers konfliktu.Może to spowodować utratę wszystkich zmian wprowadzonych przez tego subskrybent.Upewnij się, że wszystkich subskrybentów mają ten sam priorytet, chyba że oznacza logika biznesowa, w przeciwnym razie jest potencjalne rozwiązania tego problemu.

Poziom śledzenia

Niezależnie od tego, czy zmiana danych kwalifikuje się jako konflikt zależy od typu śledzenia konflikt, ustaw artykuł: na poziomie wiersza, kolumna poziom lub logicznych poziomie rekordu. Aby uzyskać więcej informacji na temat rekord logiczny - poziomu śledzenia, zobacz Wykrywanie i rozwiązywanie konfliktów w rekordach logicznych.

Podczas rozpoznawania konfliktów poziom wiersza, zmiany wprowadzone do odpowiadających im wierszy jest oceniana konfliktu, niezależnie od tego, czy zmiany są wprowadzane do tej samej kolumna.Na przykład załóżmy że dokonywane są zmiany w jednej kolumnie adres wiersza Wydawca, a druga zmiana jest podejmowana kolumna numeru telefonu odpowiedni wiersz subskrybent (w tej samej tabela).Z poziom wiersza śledzenia, ponieważ zmiany zostały wprowadzone na tym samym wierszu wykryto konflikt.Z śledzenie poziom kolumna, konflikt nie zostanie wykryta, ponieważ zmiany zostały wprowadzone inne kolumna, w tym samym wierszu.

poziom kolumna i poziom wiersza śledzenia, rozwiązanie konfliktu jest taki sam: cały wiersz danych jest zastępowana przez dane z zwycięzcą w konflikcie (logiczne śledzenia poziom rekordu, rozdzielczość zależy od właściwość artykuł logical_record_level_conflict_resolution).

Semantyka aplikacji zazwyczaj określić opcji śledzenia.Na przykład jeśli są aktualizacji danych nabywcy, na ogół wprowadzonym w tym samym czasie, takie jak numer adresu i telefonu, należy wybrać śledzenie poziom wiersza.Jeśli śledzenie poziom kolumna zostało wybrane w tej sytuacji, zmiany wprowadzone w adresie odbiorcy w jednej lokalizacji i numer telefonu nabywcy w innej lokalizacji może nie zostać wykryte jako konflikt: dane mogą być scalone podczas synchronizacji i błąd może być pominięte. W innych sytuacjach aktualizacja poszczególnych kolumn z różnymi witrynami może być rozwiązaniem najbardziej logiczne.Na przykład dwie witryny mogą mieć dostęp do różnych typów informacji statystycznych dotyczących nabywcy, takie jak przychód dolara poziom oraz łączna kwota zakupów karty kredytowej.Wybieranie poziom kolumna śledzenia zapewnia obie witryny można wprowadzić dane statystyczne dla różnych kolumn, bez generowania niepotrzebnych konflikty.

Uwaga

Jeśli aplikacja nie jest wymagane śledzenie poziom kolumna, zaleca się używać poziomie wiersza śledzenia (ustawienie domyślne), ponieważ ona zazwyczaj wyniki lepszą wydajność synchronizacji.Jeśli wiersz śledzenia tabela bazowa może zawierać maksymalnie 1024 kolumn, ale kolumn musi być filtrowane z artykuł, aby maksymalnie 246 kolumn jest publikowana.Użycie śledzenia kolumna tabela bazowa może zawierać maksymalnie 246 kolumn.

Konflikt typów

Chociaż większość konfliktów są związane z aktualizacji (aktualizację w jeden węzeł jest w konflikcie z aktualizacji lub usuwania w innym węźle), istnieją inne typy konfliktu.Każdy typ omówione w tej sekcji Konflikt może wystąpić podczas fazy przekazywania lub fazy pobierania przetwarzania korespondencji seryjnej.Przekaż przetwarzania pierwszego uzgodnienia zmian jest wykonywane w sesja danego korespondencji seryjnej i jest w fazie, podczas którego agent seryjna replikuje zmiany z subskrybent do Wydawca.Konflikty, które wykryto podczas przetwarzania tego są traktowane jak przekazać konflikty.Pobierz przetwarzania pociąga za sobą przenoszenie zmian od Wydawca do subskrybent i następuje po zakończeniu przetwarzania przekazywania.Konflikty w tej fazie przetwarzania są traktowane jak pobrać konflikty.

Aby uzyskać więcej informacji na temat typów konfliktu zobacz MSmerge_conflicts_info (Transact-SQL), szczególnie conflict_type and reason_code kolumny.

Konflikt aktualizacji aktualizacji

Scal Agent wykrywa aktualizację aktualizacja konfliktów podczas aktualizacji wierszy (lub kolumna lub rekord logiczny) w jeden węzeł jest w konflikcie z innym aktualizacji na tym samym wierszu w innym węźle.Zachowanie programu rozpoznawania nazw domyślnych w tym przypadek jest wysyłanie wersja wygrywający wiersz do węzła przegrywająca i rejestrować przegrywająca wersja wiersza w tabela konfliktów artykuł.

Usuń aktualizację konfliktów

Agent korespondencji seryjnej wykrywa aktualizację usuwania konfliktów podczas aktualizacji danych na jednym węźle powoduje konflikt z usuwania na inny.W takim przypadek Agent Scal aktualizuje wiersz; jednak kiedy Agent Scal przeszukuje tego wiersza w obiekt docelowy, nie można odnaleźć wiersza, ponieważ została ona usunięta.Jeśli zwycięzcą jest węzeł, który jest aktualizowany w wierszu, usuwanie przegrywająca węzła jest odrzucany i scal Agent wysyła nowo zaktualizowanych wierszy do loser konflikt.Scal agent rejestruje informacje o wersja przegrywająca wiersza, aby MSmerge_conflicts_info tabela.

Konflikty Zmień nie powiodło się

Agent Scal wywołuje konflikt, gdy nie można go zastosować zmianę określonego.Ta sytuacja zazwyczaj występuje wówczas ze względu na różnice w definicjach ograniczenie między wydawcę i subskrybent oraz korzystanie z niego (nie dla replikacja) właściwość ograniczenia.Przykłady:

  • Konflikt klucz obcy przez subskrybent, który może wystąpić, jeśli ograniczenie subskrybent po stronie nie jest oznaczony jako niego.

  • Różnice w bez ograniczeń pomiędzy programem Wydawca a subskrybentów i ograniczenia nie są oznaczane jako niego.

  • Niedostępność obiektów zależnych przez subskrybent.Jeśli na przykład publikować w widoku, ale nie w tabela, na której wyświetlane, zależy od tego, wystąpi awaria spróbować wstawić za pomocą tego widoku przez subskrybent.

  • łączyć Filtrowanie logiki do publikacja, który nie pasuje do klucz podstawowy i ograniczeń klucz obcy.Konflikt może wystąpić, gdy SQL Server aparat relacyjny próbuje honorować ograniczenie, ale agent korespondencji seryjnej jest Uhonorowanie definicji filtr łączenia między artykułów. Agent korespondencji seryjnej nie można zastosować zmian w obiekt docelowy węzła z powodu ograniczeń poziomie tabela, co powoduje konflikt.

  • Jeśli zdefiniowano kolumny identyfikacji artykuł, a tożsamość automatycznego zarządzania nie jest używany, może wystąpić konflikt ze względu na naruszenie unikatowego ograniczenia unikatowego indeksu lub naruszenia klucz podstawowy.Może to być problem, gdy dwa subskrybentów zostały do tej samej wartości tożsamości nowo wstawionego wiersza.Aby uzyskać więcej informacji o tożsamości zakres zarządzania Zobacz Replikowanie kolumny tożsamości.

  • Powoduje konflikt z logiki wyzwalacza Uniemożliwienie wstawiania wiersza w tabela docelowej Agent korespondencji seryjnej.Należy wziąć pod uwagę wyzwalacz aktualizacji, która jest zdefiniowana przez subskrybent, wyzwalacz nie jest oznaczony jako niego i zawiera w swojej logiki ROLLBACK.Jeśli wystąpi awaria wyzwalacz wystawia ROLLBACK transakcji, których wyniki w korespondencji seryjnej Agent wykrywanie nieudanej zmienić konfliktu.