Jak replikacji scalania wykrywa i usuwa konflikty
Replikacja scalania umożliwia wielu węzłów zmiany danych autonomicznych, więc istnieją sytuacje, w których dokonywane są zmiany w jeden węzeł może powodować konflikt z zmian na tych samych danych w innym węźle.W innych sytuacjach Agent scalić napotka błąd, takich jak naruszenie ograniczenia i nie propagowanie zmian w określonym węźle na innym węźle.W tym temacie opisano typy konflikt jak konflikty są wykrywane i rozwiązywane oraz czynniki, która wpływa na wykrywanie i rozdzielczość.
Wykrywanie i rozwiązywanie konfliktów
Agent scalić wykryje konflikt przy użyciu rodowodu kolumna MSmerge_contents tabela systemowa; Jeśli jest włączone śledzenie poziom kolumna artykuł COLV1 kolumna jest również używany.Te kolumna zawierają metadane podczas wiersza lub kolumna jest wstawiany lub aktualizowany i węzły seryjnej topologia replikacji dokonane zmiany wiersza lub kolumna.Można użyć systemowa procedura składowana sp_showrowreplicainfo (języka Transact-SQL) , aby wyświetlić metadane.
Jak scalić agenta wylicza zmiany zastosowane podczas synchronizacji, porównuje metadane dla każdego wiersza w Wydawca i abonenta.Scalanie Agent używa metadane, aby ustalić, czy wiersz lub kolumna zmienił się na więcej niż jeden węzeł w topologii i potencjalny konflikt.Po wykryciu konflikt agenta scalić uruchamia mechanizm rozwiązywania konfliktów określonych w artykule w konflikt i używa program rozpoznawania nazw do określenia zwycięzcy konfliktu.Wygrywający wiersz jest stosowane w Wydawca i subskrybenta i dane z wiersz jest zapisywane w tabela konfliktów.
Konflikty są rozwiązywane automatycznie i bezzwłocznie przez agenta scalanie, chyba że wybrano interaktywne konfliktów artykuł.Aby uzyskać więcej informacji, zobacz Interaktywne Rozwiązywanie konfliktów.Jeśli ręcznie zmieniasz wygrywający wiersz konfliktu przy użyciu replikacja scalająca Podgląd konfliktów agenta scalanie dotyczy wersja wygrywający wiersz przegrywająca serwera podczas następnej synchronizacji.
Rejestrowanie rozwiązać konflikty
Po agenta scalanie ma rozwiązać konflikt zgodnie z logiką w mechanizm rozwiązywania konfliktów, rejestruje konflikt danych zgodnie z typem konflikt:
Konflikty aktualizacji i WSTAWIANIA zapisuje pominiętą wersja wiersz do tabela konfliktów dla artykuł o nazwie w postaci conflict_<PublicationName>_<ArticleName>.Informacje ogólne konfliktu, takie jak typ konflikt, są zapisywane w tabela MSmerge_conflicts_info.
Usuń konflikty zapisuje pominiętą wersja wiersza, aby MSmerge_conflicts_info tabela.Podczas usuwania utraci przeciwko aktualizacji, jest nie danych dla wiersz (ponieważ delete), więc nic nie jest zapisywana na conflict_<PublicationName>_<ArticleName>.
Tabele konfliktów dla każdego artykuł są tworzone w bazie danych publikacja, baza danych subskrypcja, lub obu (ustawienie domyślne), w zależności od wartości określonej dla @ conflict_logging parametr sp_addmergepublication.Każda tabela konflikt ma taką samą strukturę jak artykuł, na którym jest oparta, z dodaniem origin_datasource_id kolumna.Agent Scalanie usuwa dane z tabela konfliktu, jeżeli jest starsza niż okres zachowywania konflikt w publikacja, która jest określona za pomocą @ conflict_retention parametr sp_addmergepublication (wartość domyślna jest 14 dni).
Replikacja zapewnia Podgląd konfliktów replikacji i procedury przechowywane (sp_helpmergearticleconflicts, sp_helpmergeconflictrows, i sp_helpmergedeleteconflictrows) do przeglądania danych konfliktu.Aby uzyskać więcej informacji, zobacz Jak Wyświetlić i rozwiązać konflikty danych dla korespondencji seryjnej w publikacji (SQL Server Management Studio) i Jak Wyświetl informacje o konfliktach publikacji korespondencji seryjnej (Programowanie replikacji Transact-SQL).
Rozwiązywanie konfliktów tego wpływu czynników
Istnieją dwa czynniki wpływające na jak znaleziono rozwiązuje agenta korespondencji seryjnej w konflikt:
Typ subskrypcja: klient lub serwer (czy subskrypcja jest subskrypcji ściąganej czy subskrypcja wypychana nie wpływa na rozwiązywanie konfliktów).
Używany typ śledzenie konfliktów: poziomu wierszy, na poziomie kolumna lub rekord logiczny-poziom.
Typy subskrypcji
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 (od 0,00 do 99.99), którego wartość priorytetu przypisanego nosi nazwę subskrypcja serwerowa; subskrypcja przy użyciu wartości priorytetu Wydawca nosi nazwę subskrypcja klient.Ponadto subskrybentów z subskrypcjami serwera można opublikować ponownie dane do innych subskrybentów.Poniższa tabela podsumowuje główne różnice i używa każdego typu subskrybenta.
Typ |
Wartość priorytetu |
Używany |
---|---|---|
Serwer |
Przypisany przez użytkownika |
Kiedy mają różne abonenci mają różne priorytety. |
Klient |
0,00, ale zmiany danych przyjmuje wartość priorytetu Wydawca po synchronizacji |
Kiedy chcesz wszystkim subskrybentom mają ten sam priorytet i pierwszym subskrybentom Scal za pomocą Wydawca, aby wygrać konfliktu. |
Jeśli wiersz zostanie zmieniona w subskrypcja kliencka, brak priorytetu jest przypisywana do zmiany subskrypcji jest synchronizowany.Podczas synchronizacji zmian od subskrybenta przypisywany priorytet Wydawca i zachować ten priorytet kolejne synchronizacje.W sensie Wydawca zakłada przejmuje zmianę.To zachowanie umożliwia subskrybenta pierwszej synchronizacji z programem Wydawca, aby wygrać kolejnych konfliktów z innych subskrybentów 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 traci kolejne zmiany dokonane przez subskrypcja o niższym priorytecie.
Subskrypcja nie może mieć wartość jawne priorytet wyższy niż jego Wydawca.Wydawca najwyższego poziom w seryjnej topologia replikacji ma zawsze wartość priorytetu jawne 100,00.Wszystkie subskrypcje w publikacja musi mieć wartość priorytetu poniżej tej wartości.W topologii republishing:
Jeśli subskrybenta jest publikowany ponownie dane, subskrypcji musi być subskrypcja serwerowa o wartość priorytetu mniej niż Wydawca powyżej subskrybenta.
Jeśli subskrybent nie jest publikowany ponownie dane (ponieważ jest w liść-poziom drzewa republishing), subskrypcja musi być subskrypcja klient.
Aby uzyskać więcej informacji o subskrypcji serwera i priorytetów, zobacz Przykład seryjnej konfliktów oparte na subskrypcji typu i priorytety przypisane.
Powiadomienie o konflikcie opóźnione
Powiadomienie o konflikcie opóźnione może wystąpić z subskrypcjami serwera, które mają różne konflikt priorytetów.Rozważmy następujący scenariusz, w którym bezkonfliktowe zmiany są wymieniane między Wydawca i abonenta niższym priorytecie, które powodują zmiany powodujące konflikt podczas subskrybenta wyższy priorytet z Wydawca:
Wydawca i wymiany subskrybenta o nazwie LowPrioritySub niskim priorytecie zmian przy kilku synchronizacje bez konfliktu.
Subskrybent wyższy priorytet, o nazwie HighPrioritySub, nie został zsynchronizowany z Wydawca w pewien czas i wprowadziła zmiany w tych samych wierszach, wprowadzone przez subskrybenta LowPrioritySub.
Synchronizuje subskrybenta HighPrioritySub z Wydawca i konflikty między jej zmian i subskrybenta LowPrioritySub usługi wins, ponieważ ma wyższy priorytet niż subskrybenta LowPrioritySub.Wydawca zawiera teraz zmiany wprowadzone przez subskrybenta HighPrioritySub.
Subskrybent LowPrioritySub scala się następnie z Wydawca i pliki do pobrania dużej liczby zmian z powodu konfliktów z subskrybentem HighPrioritySub.
Sytuacja ta może być problematyczne w subskrybenta niższym priorytecie wprowadził zmiany w tych samych wierszach, które są obecnie losers konfliktu.Może to spowodować utratę wszystkich zmian wprowadzonych przez tego abonenta.Potencjalnym rozwiązaniem tego problemu jest upewnij się, że abonenci mają ten sam priorytet, chyba że logika biznesowa decyduje inaczej.
Poziom śledzenia
Czy zmiana danych kwalifikuje się jako konflikt zależy od typu jest śledzenie konfliktów zestaw artykuł: poziomu wierszy, na poziomie kolumna lub rekord logiczny-poziom.Aby uzyskać więcej informacji na rekord logiczny-poziom śledzenia, zobacz Wykrywanie i rozwiązywania konfliktów w rekordach logicznych.
Gdy konflikty są rozpoznawane poziom wiersza, zmiany dokonane odpowiednie wiersze zostaną ocenione konfliktu, czy zmian do tej samej kolumna.Załóżmy na przykład, jeden zmiany kolumna adres Wydawca wiersz, a druga zmiana dokonywana jest kolumna numeru telefonu odpowiedni wiersz subskrybenta (w tej samej tabela).Z poziom wiersza śledzenia konflikt wykryto zmian wprowadzonych w tym samym wierszu.Z poziom kolumna śledzenia konflikt nie zostanie wykryta, zmian wprowadzonych w różnych kolumnach w tym samym wierszu.
Na poziomie wiersza i kolumna-poziom śledzenia rozwiązanie konfliktu jest taka sama: cały wiersz danych jest zastępowane zwycięzcą w konflikcie (dla rekord logiczny-poziom śledzenia, rozdzielczość zależy właściwość artykuł logical_record_level_conflict_resolution).
Semantyka aplikacji zazwyczaj określić opcji śledzenia.Na przykład, jeśli aktualizujesz dane odbiorcy ogólnie wprowadzone w tym samym czas, takie jak adres i telefon powinien zostać wybrany numer, poziom wierszy śledzenia.Jeśli wybrano śledzenia poziom kolumna w tej sytuacji, zmiany adresu odbiorcy w jednej lokalizacji i numer telefonu nabywcy w innej lokalizacji nie byłyby wykryte jako konflikt: dane będą scalane podczas synchronizacji i błąd mogłoby być pominięte.W innych sytuacjach aktualizowanie poszczególnych kolumn z różnych lokacji może być najbardziej logicznym rozwiązaniem.Na przykład dwie witryny mogą mieć dostęp do różnych typów informacji statystycznych dotyczących klientów, takich jak dochód Dolar poziom i całkowita kwota zakupów karty kredytowej.Wybór kolumna-śledzenie poziom gwarantuje, że obie witryny można wprowadzić dane statystyczne dla różnych kolumnas bez generowania niepotrzebnych konflikty.
Ostrzeżenie
Jeśli aplikacja wymaga śledzenia poziom kolumna, zaleca się używać poziom wierszy śledzenia (ustawienie domyślne), ponieważ on zazwyczaj wyniki lepszą wydajność synchronizacji.Jeśli wiersz śledzenia tabela bazowa może zawierać maksymalnie 1024 kolumn, ale z artykuł musi być przefiltrowana kolumn tak, aby maksymalnie 246 kolumn jest publikowana.Jeśli śledzenie kolumna tabela bazowa może zawierać maksymalnie 246 kolumn.
Konflikt typów
Chociaż większość konflikty są związane z aktualizacji (update na 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 przekazywania faza lub fazy pobierania przetwarzania korespondencji seryjnej.Przekaż przetwarzania jest wykonywana pierwszy uzgodnienia zmian w korespondencji seryjnej poszczególnych sesja i jest faza, podczas którego Agent seryjnej replikuje zmiany od subskrybenta do Wydawca.Konflikty, które wykryto podczas przetwarzania tego są określane jako przekazywanie konflikty.Pobierz przetwarzanie obejmuje przenoszenie zmiany z Wydawca do subskrybenta i występuje po przetworzeniu przekazywania.Konflikty w tej fazie przetwarzania są traktowane jak pobrać konflikty.
Aby uzyskać więcej informacji o typach konfliktu, zobacz MSmerge_conflicts_info (Transact-SQL), szczególnie conflict_type i reason_code kolumny.
Aktualizacja, aktualizacja konfliktów
Agent scalić wykrywa aktualizację aktualizacja konfliktów podczas aktualizacji wiersza (lub kolumna lub rekord logiczny) w jeden węzeł jest w konflikcie z innej aktualizacji do tego samego wiersza w innym węźle.Zachowanie domyślne rozpoznawania nazw w tym przypadek jest wysyłanie wersja wygrywający wiersz przegrywająca węzeł i dziennika pominiętą wersja wiersza w tabela konfliktów artykuł.
Konflikt usuwania aktualizacji
Agent scalić wykrywa aktualizacji Usuń konflikty podczas aktualizacji danych na jednym węźle powoduje konflikt z delete w innej.W takim przypadek Agent scalić aktualizuje wiersz; Jednak gdy Agent scalić przeszukuje tego wiersza w obiekt docelowy, nie można odnaleźć wiersza, ponieważ został usunięty.Zwycięzcą jest węzeł, który zaktualizowany wiersz, Usuwanie węzła przegrywająca jest odrzucany, a scalanie Agent wysyła zaktualizowane wiersza do Przegrany konfliktu.Scalanie Agent rejestruje informacje o pominiętą wersja wiersza, aby MSmerge_conflicts_info tabela.
Konflikty zmiana nie powiodło się
Agent scalić podnosi te konflikty, gdy nie stosuje się szczególnych zmian.Zazwyczaj dzieje ze względu na różnice w definicjach ograniczenie między Wydawca i subskrybenta i użyj właściwość ograniczenia NFR (nie dla replikacji).Przykłady:
Konflikt klucz obcy subskrybent, który może wystąpić, gdy ograniczenia po stronie subskrybent nie jest oznaczony jako NFR.
Różnice w ograniczenia między programem Wydawca a subskrybentów i ograniczenia nie są oznaczane jako NFR.
Niedostępność obiektów zależnych przez subskrybenta.Jeśli na przykład opublikować widoku, ale nie, na którym jest widoku tabela zależy, błąd wystąpi, jeśli próbujesz wstawić za pomocą tego widoku subskrybent.
Dołącz filtrowania logiki do publikacja, który nie pasuje do klucz podstawowy i ograniczeń klucz obcy.Może wystąpić konflikt podczas SQL Server aparat relacyjny próbuje honorować ograniczenie, ale Agent scalania jest Uhonorowanie definicji filtru łączyć między artykułów.Agent scalania nie można zastosować zmian na węzeł obiekt docelowy z powodu ograniczeń tabela poziom którego wyniki w konflikt.
Konflikty z powodu indeks unikatowy lub ograniczenie unique naruszenia lub klucz podstawowy naruszenia może wystąpić, jeśli kolumny tożsamości są definiowane dla artykuł i Zarządzanie tożsamościami zautomatyzowane nie jest używany.Może to być problem, gdyby dwa subskrybentów należy użyć tej samej tożsamości nowo wstawionego wiersza.Aby uzyskać więcej informacji na temat tożsamości zakres zarządzania Zobacz Replikowanie kolumny tożsamości.
Konflikty z logiki wyzwalacza uniemożliwiające agentowi scalić wstawiania wiersza w obiekt docelowy tabela.Należy rozważyć wyzwalacza aktualizacji, który jest zdefiniowany przez subskrybenta; wyzwalacz nie jest oznaczony jako NFR i obejmuje jego logikę WYCOFYWANIA.Jeśli uszkodzenie, wyzwalacz wystawia wycofywanie transakcji, które wyniki w agencie scalić wykrywanie nieudanej zmienić konflikt.
Zobacz także