Udostępnij przez


Obsługa operacji zatwierdzania

Istnieją dwa typy operacji zatwierdzania: zatwierdzenie jednofazowe i zatwierdzenie wielofazowe. Operacja zatwierdzania jednofazowego składa się z pojedynczego powiadomienia, na które menedżerowie zasobów muszą reagować, podczas gdy operacja zatwierdzania wielofazowego obejmuje dodatkowe powiadomienia dotyczące kroków przygotowywania.

Operacja zatwierdzania jednofazowego jest prostsza do zaimplementowania. Jest to odpowiednie dla systemów przetwarzania transakcji (TPS), które mają jedną z następujących cech:

  • Jeden menedżer zasobów.

  • Wiele menedżerów zasobów, z których tylko jeden jest tylko do odczytu i nie uczestniczy w operacji zatwierdzania.

Operacja zatwierdzania wielofazowego jest niezbędna, jeśli wielu menedżerów zasobów uczestniczy w operacji zatwierdzania.

operacje zatwierdzania Single-Phase

Jeśli chcesz, aby moduł TPS obsługiwał operacje zatwierdzania jednofazowego, jeden (i tylko jeden) menedżer zasobów musi zarejestrować się, aby otrzymywać powiadomienia TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT dotyczące jego rejestracji. Wszystkie inne menedżery zasobów muszą być tylko do odczytu.

Moduł TPS, który zawiera doskonałego menedżera transakcji , nie może używać zatwierdzenia jednofazowego.

Jeśli menedżer zasobów zarejestrował się w celu odbierania TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT powiadomień, KTM wysyła tego rodzaju powiadomienie, gdy klient transakcyjny wywołuje funkcję ZwCommitTransaction.

Gdy menedżer zasobów otrzyma powiadomienie TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT dla transakcji, może zatwierdzić transakcję lub odrzucić zatwierdzenie jednofazowe.

Aby zatwierdzić transakcję, menedżer zasobów musi wykonać następujące czynności:

  1. Opróżnij wszystkie dane przechowywane w tymczasowych pamięciach podręcznych (pamięć ulotna), takich jak obszar marshallingu CLFS dla strumienia dziennika CLFS.

    Menedżer zasobów musi przenieść dane z pamięci podręcznej na trwały nośnik danych. Na przykład menedżer zasobów używający środowiska CLFS może wywołać clfsFlushBuffers.

  2. Wprowadź wszystkie zmiany danych jako trwałe i publiczne (czyli widoczne poza zakresem menedżera zasobów).

  3. Wywołaj metodę ZwCommitComplete.

Po wywołaniu polecenia ZwCommitComplete menedżer zasobów powinien wywołać metodę ZwClose , aby zamknąć uchwyt rejestracji.

Aby odrzucić operację zatwierdzania jednofazowego dla transakcji, menedżer zasobów może wywołać metodę ZwSinglePhaseReject. Jeśli menedżer zasobów wywołuje metodę ZwSinglePhaseReject, KTM natychmiast zmienia operację zatwierdzania z jednej fazy na wielofazową.

Jeśli inni menedżerowie zasobów zarejestrowali się w tej samej transakcji, muszą być tylko do odczytu. Należy jednak zarejestrować się do otrzymywania powiadomienia TRANSACTION_NOTIFY_RM_DISCONNECTED, które następuje, gdy menedżer zasobów obsługujący operację jednofazowego zatwierdzania zamyka uchwyt rejestracji, nie wskazując, że transakcja została zatwierdzona lub wycofana.

Operacje zatwierdzania wielofazowego

Operacja zatwierdzania wielofazowego rozpoczyna się po wystąpieniu jednego z następujących zdarzeń:

Operacje zatwierdzania wielofazowego składają się z trzech faz sekwencyjnych: wstępne przygotowanie, przygotowanie i zatwierdzenie.

Faza przed przygotowaniem

Faza wstępnej przygotowania (znana również jako faza zero) operacji zatwierdzania rozpoczyna się, gdy KTM wysyła TRANSACTION_NOTIFY_PREPREPARE powiadomienie do wszystkich menedżerów zasobów. KTM wysyła to powiadomienie, jeśli żaden menedżer zasobów nie obsługuje operacji zatwierdzania jednofazowego dla transakcji lub jeśli nadrzędny menedżer transakcji wywołuje ZwPrePrepareEnlistment.

Gdy każdy menedżer zasobów otrzyma powiadomienie TRANSACTION_NOTIFY_PREPREPARE, musi podjąć następujące działania:

  1. Opróżnij wszystkie dane przechowywane w niestałych pamięciach podręcznych (magazyn w pamięci), takich jak obszar marshallingu CLFS dla strumienia dziennika CLFS.

    Menedżer zasobów musi przenieść dane z pamięci podręcznej na trwały nośnik magazynu. Na przykład menedżer zasobów używający środowiska CLFS może wywołać clfsFlushBuffers.

  2. Wywołaj ZwPrePrepareComplete.

Po wywołaniu menedżera zasobów ZwPreprepareComplete może on nadal odbierać żądania klientów i obsługiwać je. Jednak menedżer zasobów musi traktować wszystkie modyfikacje danych jako operacje przekazywania pamięci podręcznej, które są natychmiast zapisywane na trwałym nośniku magazynu.

Jeśli menedżer zasobów napotka błąd podczas przetwarzania TRANSACTION_NOTIFY_PREPREPARE powiadomienia, powinien wywołać polecenie ZwRollbackEnlistment , aby wycofać transakcję.

Faza przygotowywania

Faza przygotowania (znana również jako faza pierwsza) operacji zatwierdzania rozpoczyna się, gdy usługa KTM wysyła TRANSACTION_NOTIFY_PREPARE powiadomienie do wszystkich menedżerów zasobów. KTM wysyła to powiadomienie po TRANSACTION_NOTIFY_PREPREPARE, jeśli żaden menedżer zasobów nie obsługuje zatwierdzania jednofazowego lub jeśli lepszy menedżer transakcji wywołuje ZwPrepareEnlistment.

Gdy każdy menedżer zasobów otrzyma powiadomienie o TRANSACTION_NOTIFY_PREPARE, musi wykonać następujące czynności:

  1. Zatrzymaj obsługę żądań klientów i zgłoś wszelkie kolejne żądania klienta jako błędy klienta.

  2. Upewnij się, że wszystkie dane zostały przeniesione do trwałego magazynu.

  3. Wywołaj ZwPrepareComplete.

Jeśli menedżer zasobów napotka błąd podczas przetwarzania TRANSACTION_NOTIFY_PREPARE powiadomienia, powinien wywołać polecenie ZwRollbackEnlistment , aby wycofać transakcję. Jednak menedżer zasobów nie może wycofać transakcji po nazwie ZwPrepareComplete.

Faza zatwierdzania

Faza zatwierdzania (znana również jako faza druga) operacji zatwierdzania rozpoczyna się, gdy KTM wysyła TRANSACTION_NOTIFY_COMMIT powiadomienie do wszystkich menedżerów zasobów. KTM wysyła to powiadomienie po TRANSACTION_NOTIFY_PREPARE, jeśli żaden menedżer zasobów nie obsługuje zatwierdzania jednofazowego lub jeśli lepszy menedżer transakcji wywołuje ZwCommitEnlistment.

Gdy każdy menedżer zasobów otrzyma powiadomienie o TRANSACTION_NOTIFY_COMMIT, musi wykonać następujące czynności:

  1. Wprowadź wszystkie zmiany danych jako trwałe i publiczne (czyli widoczne dla innych transakcji).

    Zazwyczaj menedżer zasobów wprowadza zmiany trwałe i publiczne przez skopiowanie zapisanych danych transakcji ze strumienia dziennika do publicznego, trwałego magazynu bazy danych. Aby uzyskać więcej informacji na temat używania strumieni dzienników, zobacz Using Log Streams with KTM (Używanie strumieni dzienników z KTM).

  2. Wywołaj metodę ZwCommitComplete.

Po tym, jak menedżer zasobów wywoła ZwCommitComplete, powinien wywołać ZwClose, aby zamknąć uchwyt rejestracji.

Jeśli menedżer zasobów napotka błąd podczas przetwarzania powiadomienia TRANSACTION_NOTIFY_COMMIT, powinien się wyłączyć. Następnym razem, gdy system operacyjny ponownie załaduje menedżera zasobów, proces odzyskiwania menedżera zasobów powinien przywrócić transakcję do stanu, który był znany jako dobry przed wystąpieniem błędu.