Udostępnij przez


Tworzenie Menedżera Zasobów

Menedżerowie zasobów utrzymują dane każdej transakcji i rejestrują operacje transakcji. Jeśli system przetwarzania transakcji (TPS) ma wielu menedżerów zasobów, każdy menedżer zasobów może uczestniczyć w operacjach zatwierdzania, wycofywania i odzyskiwania każdej transakcji.

Każdy menedżer zasobów musi wyeksportować interfejs, którego klienci transakcyjni mogą używać do uzyskiwania dostępu do bazy danych lub innego zasobu obsługiwanego przez menedżera zasobów.

Zazwyczaj menedżer zasobów trybu jądra musi wykonywać następujące zadania w podanej kolejności:

  1. Utwórz strumień dziennika.

    Menedżerowie zasobów mogą używać wspólnego systemu plików dziennika (CLFS) lub innych funkcji rejestrowania w celu obsługi strumieni dzienników. Wywołanie metody ClfsCreateLogFile tworzy strumień dziennika CLFS. Menedżer zasobów musi używać strumienia dziennika do rejestrowania wszelkich informacji, które wymagają zatwierdzenia, wycofania lub odzyskania transakcji. Ponadto KTM używa strumienia dziennika do rejestrowania wszelkich wewnętrznych zmian stanu, które mogą być konieczne do odzyskania transakcji.

  2. Utwórz obiekt menedżera transakcji.

    Wywołanie metody ZwCreateTransactionManager tworzy obiekt menedżera transakcji i łączy menedżera zasobów z dodatkowym strumieniem dziennika CLFS określonym przez menedżera zasobów.

  3. Odzyskaj stan menedżera transakcji.

    Wywołanie elementu ZwRecoverTransactionManager odczytuje strumień dziennika obiektu menedżera transakcji (który utrzymuje KTM) i określa, czy moduł TPS został zamknięty przed zakończeniem wszystkich transakcji (na przykład z powodu awarii systemu). KTM przywraca stan wewnętrzny na podstawie informacji zawartych w strumieniu dziennika.

  4. Utwórz obiekt usługi Resource Manager.

    Wywołanie metody ZwCreateResourceManager tworzy obiekt menedżera zasobów i kojarzy go z wcześniej utworzonym obiektem menedżera transakcji.

  5. Odzyskaj stan menedżera zasobów.

    Wywołanie metody ZwRecoverResourceManager powoduje, że usługa KTM wysyła menedżerowi zasobów powiadomienia TRANSACTION_NOTIFY_RECOVER dotyczące wszelkich transakcji, które były w toku po tym, jak ostatnio menedżer zasobów został zamknięty. Aby uzyskać informacje o tym, jak menedżer zasobów powinien odpowiadać na te powiadomienia, zobacz Obsługa operacji odzyskiwania.

  6. Odbieranie transakcji od klientów.

    Zazwyczaj klient tworzy obiekt transakcji i używa interfejsu klienta menedżera zasobów do przekazania identyfikatora GUID obiektu transakcji do menedżera zasobów. Na przykład menedżer zasobów może podać procedurę CreateDataObject podobną do procedury opisanej w temacie Understanding TPS Components (Opis składników modułu TPS ).

  7. Włącz się w każdą transakcję.

    Wywołanie metody ZwOpenTransaction otwiera dojście do obiektu transakcji, a następnie wywołanie metody ZwCreateEnlistment powoduje utworzenie rejestracji dla transakcji. Rejestracja umożliwia menedżerowi zasobów odbieranie określonego zestawu powiadomień dotyczących transakcji.

  8. Włącz odbieranie powiadomień o transakcji.

    Menedżer zasobów może wywołać metodę ZwGetNotificationResourceManager , aby uzyskać powiadomienia synchronicznie lub wywołać metodę TmEnableCallbacks , aby zarejestrować procedurę wywołania zwrotnego ResourceManagerNotification , która KTM wywołuje zawsze, gdy jest dostępne powiadomienie.

  9. Żądania dostępu do zasobów usługi od klientów, ale nie powodują stałego wprowadzania zmian.

    Po utworzeniu obiektu transakcji klient zwykle wywołuje interfejs menedżera zasobów w celu uzyskania dostępu do zasobu menedżera zasobów. Na przykład menedżer zasobów bazy danych może odbierać żądania odczytu i zapisu w bazie danych.

    Menedżer zasobów musi rejestrować wyniki operacji odczytu i zapisu w strumieniu dziennika CLFS lub innej funkcji rejestrowania, dopóki nie otrzyma powiadomienia, że operacje transakcji zostaną zatwierdzone, wycofane lub odzyskane.

  10. Zatwierdzanie lub anulowanie operacji klienta.

    W końcu menedżer zasobów otrzymuje powiadomienie o rozpoczęciu zatwierdzania lub wycofywaniu operacji wykonywanych przez klienta. W odpowiedzi menedżer zasobów musi wykonać operacje klienta na stałe lub je odrzucić. Aby uzyskać więcej informacji na temat obsługi powiadomień dotyczących zatwierdzania i wycofywania, zobacz Obsługa operacji transakcji.

    Czasami menedżer zasobów może próbować wymusić na KTM szybkie dostarczenie powiadomienia o zatwierdzeniu lub wycofaniu, być może dlatego, że menedżer zasobów ustalił, że urządzenie zostało niespodziewanie usunięte. W takim przypadku menedżer zasobów może wywołać metodę TmRequestOutcomeEnlistment.

  11. Zamknij uchwyt obiektu rejestracji.

    Po zakończeniu przetwarzania transakcji przez menedżera zasobów należy wywołać metodę ZwClose , aby zamknąć dojście obiektu rejestracji

  12. Zamknij uchwyt obiektu menedżera zasobów i uchwyt obiektu menedżera transakcji.

    Przed zwolnieniem menedżera zasobów należy wywołać metodę ZwClose, aby zamknąć uchwyt obiektu menedżera zasobów i uchwyt obiektu menedżera transakcji.

Kroki od 1 do 5 należy wykonać w kodzie inicjowania menedżera zasobów. Jeśli na przykład menedżer zasobów jest sterownikiem trybu jądra, kod inicjowania jest procedurą DriverEntry sterownika.

Kroki od 6 do 11 są zwykle wykonywane w kodzie, który odpowiada na żądania od klientów transakcyjnych.

Krok 12 musi zostać wykonany w ostatnim kodzie oczyszczania menedżera zasobów, takim jak procedura zwalniania sterownika trybu jądra.

Tworzenie rejestracji Read-Only

Rejestracja tylko do odczytu jest rejestracją, która nie odbiera żadnych powiadomień z KTM. Menedżer zasobów może utworzyć dowolną rejestrację tylko do odczytu, wywołując element ZwReadOnlyEnlistment. To wywołanie powoduje, że usługa KTM przestanie dostarczać powiadomienia do menedżera zasobów.

Po wywołaniu przez menedżera zasobów funkcji ZwCreateEnlistment, funkcję ZwReadOnlyEnlistment można wywołać w dowolnym momencie do momentu, w którym zwykle wywoływana jest funkcja ZwPrepareComplete.

Istnieją dwa powody, dla których menedżer zasobów może chcieć wywołać funkcję ZwReadOnlyEnlistment.

  • Twój menedżer zasobów uczestniczył w transakcji i w pewnym momencie, zanim otrzyma powiadomienie TRANSACTION_NOTIFY_COMMIT, stwierdził, że nie musi już brać udziału w operacji zatwierdzania transakcji.

    Na przykład gdy menedżer zasobów otrzyma powiadomienie TRANSACTION_NOTIFY_PREPARE, może określić, że żadna z operacji transakcji nie zmieniła bazy danych menedżera zasobów. Menedżer zasobów może wywołać element ZwReadOnlyEnlistment zamiast ZwPrepareComplete , aby usunąć się z transakcji.

  • Menedżer zasobów nigdy nie uczestniczy w żadnej operacji zatwierdzania transakcji.

    Na przykład menedżer zasobów może monitorować dane wysyłane przez klienta bez modyfikowania przechowywanej bazy danych. W takim przypadku menedżer zasobów może wywołać funkcję ZwReadOnlyEnlistment natychmiast po wywołaniu funkcji ZwCreateEnlistment. Ponadto możesz zdecydować się, aby taki menedżer zasobów był niestabilny, zgodnie z opisem w następnej sekcji tego tematu.

Po tym, jak menedżer zasobów wywoła ZwReadOnlyEnlistment, można wywołać metodę ZwClose, aby zamknąć dojście rejestracji.

Tworzenie menedżera Volatile-Resource

Menedżer nietrwałych zasobów to menedżer zasobów, który nie przechowuje trwałych danych. Na przykład można utworzyć menedżera zasobów volatile do monitorowania danych wysyłanych przez klienta, jeśli menedżer zasobów nie modyfikuje trwale przechowywanej bazy danych. Menedżerowie nietrwałych zasobów zwykle nie rejestrują aktywności transakcji i dlatego nie mogą wykonywać operacji odzyskiwania ani wycofywania.

Menedżer zasobów tymczasowych musi ustawić flagę RESOURCE_MANAGER_VOLATILE, gdy wywołuje ZwCreateResourceManager. Jeśli ta flaga jest ustawiona, KTM nie rejestruje żadnych informacji o menedżerze zasobów w strumieniu dziennika skojarzonego obiektu menedżera transakcji.

Menedżer zasobów może również ustawić flagę TRANSACTION_MANAGER_VOLATILE, gdy wywołuje element ZwCreateTransactionManager. Jeśli ta flaga jest ustawiona, KTM nie tworzy strumienia dziennika dla obiektu menedżera transakcji. Ponadto wszelkie dodatkowe menedżery zasobów połączone z obiektem menedżera transakcji również muszą być nietrwałe i ustawiać flagę RESOURCE_MANAGER_VOLATILE.

Dodawanie usługi Resource Manager do istniejącej usługi TPS

Jeśli musisz dodać dodatkowego menedżera zasobów do istniejącego modułu TPS, masz dwie opcje:

  • Nowy menedżer zasobów wywołuje element ZwCreateTransactionManager , aby utworzyć własny obiekt menedżera transakcji.

    Użyj tego wyboru, jeśli menedżer zasobów nie komunikuje się z innymi menedżerami zasobów w module TPS.

  • Nowy menedżer zasobów wywołuje funkcję ZwOpenTransactionManager w celu połączenia się z istniejącym obiektem menedżera transakcji.

    Użyj tego wyboru, jeśli menedżer zasobów musi komunikować się z innymi menedżerami zasobów w module TPS. Menedżer zasobów, który wywołuje element ZwCreateTransactionManager , musi współużytkować identyfikator GUID obiektu menedżera transakcji, nazwę strumienia dziennika lub nazwę obiektu, aby inni menedżerowie zasobów mogli wywołać element ZwOpenTransactionManager. Te inne menedżery zasobów mogą wywołać element ZwQueryInformationTransactionManager , aby uzyskać dodatkowe informacje o obiekcie menedżera transakcji.

Po dodaniu menedżera zasobów do modułu TPS klienci, którzy wiedzą o menedżerze zasobów, mogą wywoływać interfejs klienta menedżera zasobów.