Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano mechanizmy udostępniane przez infrastrukturę w System.Transactions celu optymalizacji wydajności.
Promowany Jednofazowy Zaciąg
Infrastruktura System.Transactions zarządza transakcją w jednej domenie aplikacji, która obejmuje maksymalnie 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. Transakcja zarządzana przez MSDTC nie jest tak wydajna, jak transakcja zarządzana przez System.Transactions infrastrukturę.
Aby zoptymalizować wydajność, infrastruktura System.Transactions zapewnia promowalne zgłoszenie jednofazowe (PSPE), które umożliwia, aby pojedynczy zdalny zasób trwały, znajdujący się w innej domenie aplikacji, procesie lub maszynie, mógł uczestniczyć w transakcji System.Transactions bez powodowania jej eskalacji do transakcji MSDTC. Ten menedżer zasobów (RM) może hostować i "posiadać" transakcję, która może być później eskalowana do transakcji rozproszonej (lub transakcji MSDTC) w razie potrzeby. Zmniejsza to prawdopodobieństwo korzystania z MSDTC.
Ten konkretny menedżer zasobów zwykle ma własne wewnętrzne transakcje niedystrybuowane i musi obsługiwać konwersję tych transakcji na transakcje rozproszone w czasie działania. Na przykład program SQL Server 2005 jest takim menedżerem zasobów. W takim przypadku System.Transactions infrastruktura przyjmuje pasywną rolę zarządzania, monitorując transakcję pod kątem potrzeby eskalacji. Aby obsługiwać interakcję między infrastrukturą System.Transactions a menedżerem zasobów, ten ostatni musi zaimplementować interfejs IPromotableSinglePhaseNotification.
Metoda EnlistPromotableSinglePhase jest używana do rejestracji pojedynczego trwałego zasobu, który można eskalować później. Ta metoda gwarantuje, że rejestracja może być eskalowana w razie potrzeby. Jeśli rejestracja zakończy się sukcesem, menedżer zasobów tworzy swoją wewnętrzną transakcję i powiązuje ją z transakcją System.Transactions. Jeśli rejestracja PSPE zakończy się niepowodzeniem, RM zamiast tego powinien zarejestrować się przy użyciu metody EnlistDurable. Błędy rejestracji w PSPE mogą wystąpić, gdy transakcja jest już transakcją rozproszoną lub gdy inny menedżer zasobów wykonał już rejestrację PSPE
Po zalogowaniu wywołania przez klientów do zatwierdzenia lub przerwania System.Transactions transakcji są konwertowane na wywołania usługi Resource Manager przez wywołanie SinglePhaseCommit metody lub Rollback odpowiednio.
Jeśli transakcja System.Transactions nigdy nie wymaga eskalacji, po jej zatwierdzeniu Moduł zarządzający zasobami otrzymuje SinglePhaseCommit powiadomienie. Następnie może zatwierdzić transakcję wewnętrzną, 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 metody Promote na interfejsie ITransactionPromoter, z którego pochodzi interfejs IPromotableSinglePhaseNotification. Następnie menedżer zasobów konwertuje transakcję wewnętrznie z transakcji lokalnej (która nie wymaga rejestrowania) do obiektu transakcji, który może uczestniczyć w transakcji DTC i kojarzy ją z już wykonaną pracą. Gdy transakcja zostanie poproszona o zatwierdzenie, menedżer transakcji nadal wysyła SinglePhaseCommit powiadomienie do menedżera zasobów, który zatwierdza transakcję rozproszoną utworzoną podczas eskalacji.
Uwaga / Notatka
Ślady TransactionCommitted (generowane podczas wywołania Commit w eskalowanej transakcji) zawierają identyfikator aktywności transakcji DTC.
Aby uzyskać więcej informacji na temat eskalacji zarządzania, zobacz Eskalacja zarządzania transakcjami.
Scenariusz eskalacji zarządzania transakcjami
W poniższym scenariuszu przedstawiono eskalację rozproszonej transakcji przy użyciu System.Data namespace'u jako "proxy" dla 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. Transakcja musi być eskalowana do usługi DTC w ramach pełnej transakcji zatwierdzania dwufazowego.
W tym scenariuszu
CN1 wywołuje metodę EnlistPromotableSinglePhase aby zarejestrować się w transakcji. Następnie transakcja jest nadal lokalna i nie ma żadnych innych awansowalnych wpisów w transakcji, więc EnlistPromotableSinglePhase wywołanie się uda.
Gdy drugie połączenie CN2 wykonuje EnlistPromotableSinglePhase, wywołanie kończy się niepowodzeniem, ponieważ istnieje inne zobowiązanie do awansu. W związku z tym CN2 musi uzyskać transakcję DTC, aby przekazać ją do bazy danych SQL. W tym celu używa jednej z metod dostarczonych przez TransactionInterop klasę do utworzenia formatu transakcji, którą można przekazać sql.
System.Transactions wywołuje metodę Promote w interfejsie ITransactionPromoter zaimplementowaną przez CN1.
W tym momencie CN1 eskaluje transakcję, używając pewnego mechanizmu specyficznego dla programu SQL 2005 i System.Data.
Wartość zwracana z Promote metody jest tablicą bajtów zawierającą token propagacji dla transakcji. 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że użyć danych odebranych z wywołania jednej z metod TransactionInterop , aby przekazać transakcję do języka SQL.
Teraz oba są zaangażowane w rozproszoną transakcję DTC.
Optymalizacja zatwierdzania jednofazowego
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 przyłączyć się do transakcji przy użyciu metod EnlistDurable lub EnlistVolatile. W szczególności parametr EnlistmentOptions powinien być równy None , aby upewnić się, że zostanie wykonane jedno zatwierdzenie fazy.
Ponieważ interfejs ISinglePhaseNotification pochodzi z interfejsu IEnlistmentNotification, jeśli RM nie kwalifikuje się do jednoetapowego zatwierdzania, nadal może otrzymywać powiadomienia o dwuetapowym zatwierdzaniu. Jeśli menedżer zasobów otrzyma powiadomienie SinglePhaseCommit od TM, powinien spróbować wykonać niezbędne działania do zatwierdzenia, a następnie odpowiednio poinformować menedżera transakcji, czy transakcja ma zostać zatwierdzona lub wycofana, wywołując metodę Committed, Aborted lub InDoubt na parametrze SinglePhaseEnlistment. Odpowiedź Done podczas rejestracji na tym etapie oznacza semantykę ReadOnly. W związku z tym nie należy odpowiadać Done oprócz żadnej z innych metod.
Jeśli istnieje tylko jedno niestabilne zgłoszenie i brak trwałego zgłoszenia, niestabilne zgłoszenie 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.