Optymalizacja za pomocą zatwierdzania jednofazowego i umożliwiającego awansowanie powiadomienia jednofazowego
W tym temacie opisano mechanizmy udostępnione przez System.Transactions infrastruktury w celu optymalizacji wydajności.
Rejestracja awansowanie jedna faza
Administrator System.Transactions infrastruktury ocenia transakcję w jednej domenie aplikacji, która obejmuje co najwyżej jeden trwały zasób lub wiele nietrwałych zasobów. System.Transactions Ponieważ infrastruktura używa tylko wywołań domeny wewnątrz aplikacji, zapewnia najlepszą przepływność i wydajność.
Jeśli jednak transakcja jest dostarczana do innego obiektu w innej domenie aplikacji (w tym między granicami procesów i maszyn) na tym samym komputerze, lub jeśli masz zarejestrować innego trwałego menedżera zasobów, System.Transactions infrastruktura automatycznie eskaluje transakcję do zarządzania przez MSDTC. Zarządzane przez MSDTC transakcji nie jest performance-wise jako jeden zarządzane przez System.Transactions infrastruktury.
Aby zoptymalizować wydajność, System.Transactions infrastruktura zapewnia promotable single phase enlistment (PSPE), który umożliwia pojedynczy zdalny zasób trwały znajdujący się w innej domenie aplikacji, procesie lub maszynie, aby uczestniczyć w System.Transactions transakcji bez powodowania eskalacji do transakcji MSDTC. Ten Menedżer zasobu (MB) umożliwia przechowywanie i "własnością" transakcji, która później można przekazany do transakcji rozproszonych (lub transakcji MSDTC), jeśli to konieczne. Zmniejsza to prawdopodobieństwo za pomocą MSDTC.
Ten konkretny menedżer zasobów zwykle ma własne wewnętrzne transakcje nieprodowane i musi obsługiwać konwertowanie tych transakcji na transakcje rozproszone w czasie wykonywania. Na przykład program SQL Server 2005 jest takim menedżerem zasobów. W takim przypadku System.Transactions infrastruktury przyjmuje rolę Zarządzanie bierne po prostu Monitoruj transakcji na potrzeby eskalacji. Aby obsługiwać interakcję między infrastrukturą System.Transactions a menedżerem zasobów, ten ostatni musi zaimplementować interfejs IPromotableSinglePhaseNotification.
EnlistPromotableSinglePhase Metoda służy do zarejestrować pojedynczy trwałe zasób, który może zostać przekazany później. Ta metoda zapewnia, że rejestracja może być przekazany zgodnie z potrzebami. Jeśli rejestracja zakończy się powodzeniem, Menedżer zasobów tworzy jego wewnętrznego transakcji i kojarzy ją z System.Transactions transakcji. W przypadku niepowodzenia rejestracji PSPE Menedżera zasobów zamiast tego należy zarejestrować przy użyciu EnlistDurable metody. Błędów, aby zarejestrować PSPE może się zdarzyć, gdy transakcja została już transakcja rozproszona lub innego menedżera zasobów przeprowadził już rejestracji PSPE
Gdy zarejestrowana, wywołuje przez klientów, aby zatwierdzić lub przerwać System.Transactions transakcji są konwertowane na wywołania na Menedżera zasobów, wywołując SinglePhaseCommit metody lub Rollback odpowiednio.
Jeśli System.Transactions transakcji nigdy nie wymaga eskalacji, gdy transakcja zostanie zatwierdzone, Menedżer zasobów odbiera SinglePhaseCommit powiadomienia. Można ją następnie Zatwierdź wewnętrzny transakcji, która została początkowo utworzona.
Jeśli transakcja System.Transactions musi zostać eskalowana (np. w celu obsługi wielu menedżerów zasobów), System.Transactions informuje menedżera zasobów przez wywołanie Promote metody w interfejsie ITransactionPromoter , z którego IPromotableSinglePhaseNotification pochodzi interfejs. Menedżer zasobów następnie konwertuje transakcji wewnętrznie z lokalnym transakcji (które nie wymagają rejestrowania) obiekt transakcji, który jest w stanie udział w transakcji usługi i kojarzy ją z już pracy. Gdy transakcja jest proszony o zatwierdzania, Menedżer transakcji nadal wysyła SinglePhaseCommit powiadomienia do Menedżera zasobów, które zatwierdzeń transakcji rozproszonych, utworzony podczas eskalacji.
Uwaga
Ślady TransactionCommitted (generowane, gdy zatwierdzenie jest wywoływane na eskalowanej transakcji) zawierają identyfikator działania transakcji DTC.
Aby uzyskać więcej informacji na temat eskalacji zarządzania, zobacz Eskalacja zarządzania transakcjami.
W tym scenariuszu eskalacji zarządzania transakcji
Następujący scenariusz pokazuje kontaktu z transakcji rozproszonych za pomocą System.Data nazw jako "proxy" Menedżera zasobów. W tym scenariuszu przyjęto założenie, że istnieje już jedno System.Data połączenie z bazą danych, CN1, biorące udział w transakcji, a aplikacja chce zaangażować inne System.Data połączenie CN2. Transakcji musi zostać przekazany do usługi, jako transakcja pełną rozproszonej dwufazowe.
W tym scenariuszu
Wywołania CN1 EnlistPromotableSinglePhase metodę, aby zarejestrować transakcji. Następnie transakcja jest nadal lokalnego i nie ma żadnych awansowanie rejestracji w transakcji, więc EnlistPromotableSinglePhase połączenie zakończy się powodzeniem.
Po drugie połączenie, CN2 EnlistPromotableSinglePhase, połączenie nie powiedzie się, ponieważ jest zaangażowane innego awansowanie rejestracji. W związku z tym CN2 musi uzyskać transakcję usługi, aby można było przekazać je do programu SQL. W tym celu używa jednej z metod dostarczonych przez TransactionInterop klasy w celu uzyskania formatu transakcji, która może być SQL.
System.Transactions wywołuje metodę Promote w interfejsie ITransactionPromoter zaimplementowaną przez CN1.
W tym momencie CN1 Eskalowanie transakcji, niektóre mechanizm specyficzne dla SQL 2005 i System.Data.
Wartość zwrócona przez Promote metoda jest zawierający tokenu propagacji transakcji tablicy bajtów. System.Transactions używa tego tokenu propagacji, aby utworzyć transakcję DTC, którą może włączyć do transakcji lokalnej.
W tym momencie CN2 można użyć dane otrzymane z jednej z metod przez wywołanie TransactionInterop do przekazania transakcji SQL.
Teraz zarówno biorących udział w transakcji rozproszonych usługi.
Jedna faza zatwierdzania optymalizacji
Protokół zatwierdzania jednofazowego jest bardziej wydajny w czasie wykonywania, ponieważ wszystkie aktualizacje są wykonywane bez wyraźnej koordynacji. Aby skorzystać z tej optymalizacji, należy zaimplementować menedżera zasobów przy użyciu ISinglePhaseNotification interfejsu dla zasobu i zarejestrować w transakcji przy użyciu EnlistDurable metody lub EnlistVolatile . W szczególności parametr EnlistmentOptions powinien być równy None , aby upewnić się, że zostanie wykonane jedno zatwierdzenie fazy.
Ponieważ ISinglePhaseNotification pochodzi od klasy interfejs IEnlistmentNotification interfejsu, jeśli Twój Menedżera zasobów jest nieodpowiedni dla jednego etapu zatwierdzania, może nadal odbierać fazy dwa powiadomienia zatwierdzania. W przypadku otrzymania swojego menedżera zasobów SinglePhaseCommit powiadomienie z Menedżer transakcji, jego starać się wykonują pracę niezbędne do zatwierdzania i odpowiednio informują menedżera transakcji, jeśli transakcja ma zostać przekazana lub wycofana przez wywołanie metody Committed, Aborted, lub InDoubt metody w SinglePhaseEnlistment parametru. Odpowiedź na Done temat rejestracji na tym etapie oznacza semantyka ReadOnly. W związku z tym nie należy odpowiadać Done poza żadną z innych metod.
Jeśli istnieje tylko jedna nietrwała rejestracja i brak trwałej rejestracji, rejestracja lotna otrzymuje powiadomienie SPC. Jeśli istnieją jakiekolwiek nietrwałe rejestracje i tylko jedna trwała rejestracja, rejestracje lotne otrzymają 2PC. Po zakończeniu trwałej rejestracji otrzymuje spC.