Publikowanie wykonanie procedura przechowywana w transakcji replikacja

Jeśli użytkownik ma jeden lub więcej procedur przechowywanych, które są wykonać w Wydawca i wpływa na opublikowaną tabel, należy rozważyć tych procedur przechowywanych w publikacja w postaci artykułów wykonać procedura przechowywana.Definicja procedury (Instrukcja CREATE PROCEDURE) są replikowane do subskrybent podczas inicjowania subskrypcja, gdy procedura jest wykonywana przez wydawcę, replikacja wykonuje odpowiednie procedury przez subskrybent.Może zapewnić znacznie lepszą wydajność w przypadkach, gdy duża partia operacje są wykonywane, ponieważ jest replikowany tylko wykonanie procedury, pomijanie konieczność replikowania poszczególnych zmian dla każdego wiersza.Załóżmy na przykład utworzyć następującą procedura przechowywana w bazie danych publikacja:

CREATE PROC give_raise AS
UPDATE EMPLOYEES SET salary = salary * 1.10

Procedura ta daje każde 10 000 pracowników w firmie podwyżki płac 10 procent.Po wykonaniu tej procedura przechowywana w Wydawca, aktualizuje wynagrodzenia dla każdego pracownika.Bez replikacja wykonanie procedura przechowywana aktualizacja będzie można wysłać do subskrybentów jako duże, multi-step transakcji:

BEGIN TRAN
UPDATE EMPLOYEES SET salary = salary * 1.10 WHERE PK = 'emp 1'
UPDATE EMPLOYEES SET salary = salary * 1.10 WHERE PK = 'emp 2'

I to powtarza aktualizacje 10 000.

Za pomocą replikacji wykonać procedura przechowywana replikacja wysyła tylko polecenie do wykonać procedura przechowywana w subskrybent, zamiast zapisywania wszystkich aktualizacji do baza danych dystrybucji i wysyła je przez sieć do subskrybent:

EXEC give_raise
Important noteImportant Note:

Procedura przechowywana replikacja nie jest odpowiednia dla wszystkich aplikacji.Jeżeli artykuł jest filtrowana poziomo, tak aby były różne zestawy wierszy wydawca niż przez subskrybent, wykonywanie tej samej procedura przechowywana w obu zwraca różne wyniki.Podobnie jeśli aktualizacja jest oparta na podkwerendzie innego, niezreplikowanej tabela, wykonywanie tej samej procedura przechowywana Wydawca i subskrybent zwraca różne wyniki.

Aby opublikować wykonanie procedura przechowywana

Modyfikowanie procedury subskrybent

Domyślnie, definicja procedura przechowywana w Wydawca te będą propagowane do poszczególnych subskrybent.Jednak można także modyfikować procedura przechowywana przez subskrybent.Jest to przydatne, jeśli różne logiki do wykonania Wydawca i subskrybent.Na przykład należy wziąć pod uwagę sp_big_delete, procedura przechowywana Wydawca, które dostępne są dwie funkcje: Usuwa 1,000,000 wierszy z tabela replikowanej big_table1 i aktualizuje tabela niezreplikowanej big_table2.Zmniejszenie zapotrzebowania na zasoby sieciowe, użytkownik powinien propagować usuwania 1 miliona wierszy jako procedura przechowywana według publikacji sp_big_delete.Subskrybent które można modyfikować sp_big_delete usunąć tylko 1 miliona wierszy i nie wykonywać kolejnych aktualizacji big_table2.

Uwaga

Domyślnie, wszystkie zmiany wprowadzone przy użyciu instrukcji ALTER PROCEDURE na Wydawca są propagowane do subskrybent.Aby temu zapobiec, należy wyłączyć propagacji zmiany schematu przed wykonaniem instrukcji ALTER PROCEDURE.Aby uzyskać informacje dotyczące zmiany schematu Zobacz Wprowadzanie zmian schematu na bazy danych w publikacja.

Typy artykułów wykonanie procedura przechowywana

Istnieją dwa różne sposoby, w którym mogą być publikowane wykonanie procedura przechowywana: Artykuł wykonanie procedury możliwy do serializacji i artykuł wykonanie procedury.

  • Możliwy do serializacji opcja jest zalecana, ponieważ jej wykonanie procedury replikuje tylko wtedy, gdy procedura jest wykonywany w kontekście transakcji możliwy do serializacji.Jeśli procedura przechowywana jest wykonywana z poza transakcją możliwy do serializacji, zmiany danych w tabelach opublikowanych są replikowane jako serię DML instrukcji.To zachowanie przyczynia się do wprowadzania danych przez subskrybent zgodne z danymi na Wydawca.Jest to szczególnie przydatne w przypadku operacji wsadowych, takich jak operacji oczyszczania duże.

  • W przypadku opcji wykonywanie procedury jest możliwe, że wykonanie może być replikowany do wszystkich subskrybentów niezależnie od czy pojedyncze instrukcje w procedura przechowywana pomyślne.Ponadto zmian w danych w procedurze przechowywanej może wystąpić w wielu transakcji, dane z szybkością abonentów mogą nie być zgodne z danymi na Wydawca.Aby rozwiązać te problemy, jest wymagane czy subskrybentów są tylko do odczytu i używać na większą niż odczytu nieprzydzielonych poziom izolacji.Jeśli używasz odczytu nieprzekazane zmiany danych w tabelach opublikowanych są replikowane jako serię instrukcji DML.Aby uzyskać więcej informacji na temat poziomów izolacji zobacz Poziomy izolacji w aparat bazy danych.

Poniższy przykład pokazuje, dlatego zalecane jest, które zestaw zapasowej replikacja procedury jako możliwy do serializacji procedury artykułów.

BEGIN TRANSACTION T1
SELECT @var = max(col1) FROM tableA
UPDATE tableA SET col2 = <value> 
   WHERE col1 = @var 

BEGIN TRANSACTION T2
INSERT tableA VALUES <values>
COMMIT TRANSACTION T2

W poprzednim przykładzie zakłada się, że SELECT w transakcji T1 stanie się przed INSERT w transakcji T2.

Jeśli procedura nie jest wykonywana w obrębie transakcji możliwy do serializacji (z poziom izolacji ustaw SERIALIZABLE), przed T1 będzie przekazać T2 może wstawić nowego wiersza w zakresie instrukcja SELECT w T1 i jego transakcji.Oznacza to również, że mają one być stosowane przez subskrybent przed T1.Po zastosowaniu T1 subskrybent SELECT potencjalnie może zwracać wartość inną niż przez wydawcę i mogą wpływać na różne wyniki z aktualizacji.

Jeśli procedura jest wykonywana w obrębie transakcji możliwy do serializacji, transakcji T2 nie może wstawić do zakres w instrukcja SELECT w T2.Zostaną zablokowane, dopóki T1 zatwierdza, zapewniając te same wyniki przez subskrybent.

Blokady zostanie wstrzymana dłużej wykonaj procedurę w obrębie transakcji możliwy do serializacji i może być przyczyną ograniczonej współbieżność.

Ustawienie XACT_ABORT

Podczas replikowania wykonanie procedura przechowywana, ustawienie w sesja, wykonywanie procedura przechowywana, należy określić XACT_ABORT ON.Jeśli jest XACT_ABORT zestaw do OFF, i wystąpi błąd podczas wykonywania procedury Wydawca, to samo przez subskrybent, wystąpi błąd powoduje dystrybucji agenta nie powiedzie się.Określanie ON XACT_ABORT zapewnia, że wszelkich błędów napotkanych podczas wykonywania na przyczyny Wydawca cały wykonanie do zostać przywrócona, unikanie awarii Agent dystrybucji.Aby uzyskać więcej informacji na temat ustawiania XACT_ABORT zobacz zestaw XACT_ABORT (języka Transact-SQL).

Jeśli wymagane jest ustawienie z XACT_ABORT OFF, określ -SkipErrors parametr dla agenta dystrybucji.Dzięki temu agenta kontynuowanie stosowania zmian przez subskrybent, nawet wtedy, gdy wystąpi błąd.Aby uzyskać więcej informacji na temat tego parametru zobacz Skipping Errors in Transactional Replication.