Na początku informatyki nie było potrzeby przeprowadzania transakcji rozproszonych. Wraz ze wzrostem liczby aplikacji ważnym zagadnieniem stała się synchronizacja danych. Firmy dużo zapłaciły za utrzymanie zsynchronizowanych systemów pod względem przepływu danych. W rezultacie powstał protokół zatwierdzania dwufazowego, zwany XA (eXtended Architecture). Protokół ten zapewnia właściwości podobne do ACID dla globalnego przetwarzania transakcji. W tym artykule postaram się wyjaśnić szczegóły transakcji XA i wykorzystania XA Transactions we frameworku Spring.

Protokół 2-fazowego zatwierdzania to protokół zatwierdzania atomowego dla systemów rozproszonych. Protokół ten, jak sama nazwa wskazuje, składa się z dwóch faz. Pierwsza to faza żądania zatwierdzenia, w której menedżer transakcji koordynuje wszystkie zasoby transakcji w celu zatwierdzenia lub przerwania. W fazie zatwierdzania menedżer transakcji decyduje o sfinalizowaniu operacji przez zatwierdzenie lub przerwanie zgodnie z głosami każdego zasobu transakcji. Następnie przejdziemy do szczegółów implementacji protokołu 2PC.

Zobacz tutaj, aby uzyskać dostęp do zasobów dotyczących współdziałania Java + .NET za pośrednictwem 2PC.

Transakcje XA wymagają globalnego identyfikatora transakcji i lokalnego identyfikatora transakcji (xid) dla każdego zasobu XA. Każdy zasób XA jest rejestrowany w Menedżerze XA za pomocą metody start(xid). Ta metoda mówi, że zasób XA jest zaangażowany w transakcję (być gotowym do operacji). Następnie pierwsza faza protokołu 2PC jest realizowana poprzez wywołanie metody Prepare(xid). Ta metoda wymaga głosowania OK lub ABORT z XA Resource. Po otrzymaniu głosu z każdego zasobu XA, menedżer XA decyduje o wykonaniu operacji commit(xid), jeśli wszystkie zasoby XA wysyłają OK lub decyduje się na wycofanie (xid), jeśli zasób XA wysyła ABORT. Na koniec wywoływana jest metoda end(xid) dla każdego zasobu XA informująca o zakończeniu transakcji. Spójrz na rysunek, aby lepiej zrozumieć. Ponieważ budujemy tło we wdrażaniu transakcji XA, przejdziemy dalej i zobaczymy, jak wpisz to polecenie to polecenie to polecenia awarii i możliwych rozwiązań.


Awarie mogą wystąpić w dowolnym momencie z powodu utraty sieci, awarii komputera i błędu administratora. W transakcji XA będziemy kategoryzować te awarie według faz, w których występują. Pierwsza faza awarii ma miejsce przed rozpoczęciem protokołu. Jest to prosta awaria, której system nie musi wycofywać ani wykonywać żadnych operacji. Po prostu nie wykonujemy operacji na ten konkretny moment. Po drugie wpisz to polecenie to polecenie to polecenie niepowodzenia może wystąpić w fazie przygotowania (zatwierdź-żądanie), którą można łatwo obsłużyć przez wycofywanie przy użyciu zasad limitu czasu. Ostatnie, ale nie najmniej ważne, to awarie fazy zatwierdzania, które mogą wystąpić z powodu niepełnego wycofywania i wszelkich problemów w łańcuchu. We wszystkich powyższych sytuacjach menedżer transakcji próbuje rozwiązać problem. Następnie zobaczymy, jak menedżer transakcji próbuje przezwyciężyć niepowodzenia.

Podczas odzyskiwania menedżer transakcji wywołuje metodę odzyskiwania każdego zasobu XA. Zasoby XA śledzą dzienniki i próbują odbudować ich najnowszy stan. Menedżer transakcji wywołuje niezbędne operacje wycofywania i misja zostaje wykonana. Ten proces może wydawać się szczęśliwą ścieżką, ale istnieje wiele wyjątkowych sytuacji, w których logi są problematyczne, takie jak uszkodzenie. W tego rodzaju sytuacjach menedżer transakcji stosuje pewne metody heurystyczne, aby rozwiązać problem. Ponadto proces odzyskiwania zależy od dzienników zapisu z wyprzedzeniem, w których zapisujesz dzienniki operacji przed zastosowaniem. W przypadku problemów z wydajnością te dzienniki są zapisywane w ich własnym formacie (nie używając żadnej serializacji) i system powinien lepiej je wsadowo, jeśli to możliwe. Następnie przechodzimy do zabawnej części, którą jest obsługa transakcji XA przez framework Spring.

Framework Spring zapewnia rozbudowane środowisko do tworzenia aplikacji internetowych i samodzielnych. Podobnie jak inne narzędzia, które zapewnia, transakcje XA są również obsługiwane przez Spring. Jednak ta obsługa nie jest implementacją natywną i wymaga hibernacji, kontenera internetowego lub frameworka, który zapewnia XA Transaction Management. Spring ma JtaTransactionManager, który zapewnia narzędzia do zarządzania transakcjami i ukrywa szczegóły. W ten sposób możemy zarządzać transakcjami dla wielu DataSources, które są aktualizowane jednocześnie. Jeśli chodzi o zarządzanie transakcjami XA, obsługa hibernacji i kontenerów internetowych dla transakcji XA jest dobrze udokumentowana, nie trzeba o tym wspominać. Jednak praca z frameworkiem, który zapewnia transakcje XA, może być myląca. W związku z tym będę kontynuował ten wpis, wprowadzając Bitronix Transaction Manager.

Bitronix można łatwo skonfigurować, zapewniając jednocześnie dobre wsparcie dla zarządzania transakcjami. Nie jest powszechnie używany w samodzielnych aplikacjach, ale postaram się podać konfigurację dla samodzielnej aplikacji w następujący sposób.

Możemy teraz mieć wiele źródeł danych, które można skonfigurować w następujący sposób. Każde źródło danych powinno mieć unikalną właściwość uniqueName. Poniższa konfiguracja dotyczy Oracle, inne bazy danych mogą mieć inne konfiguracje. Na każdy inny szczegół możesz sprawdzić stronę Bitronix.

Podsumowując, spróbowaliśmy wyjaśnić, czym jest XA Transactions, protokoły leżące u jego podstaw oraz integracja Bitronix Transaction Management ze Springiem w samodzielnej aplikacji. Aby rozszerzyć, XA Transactions umożliwia jednoczesne modyfikowanie różnych źródeł danych. Ponadto transakcje XA są obsługiwane przez kontenery internetowe lub struktury przypominające hibernację. Niemniej jednak może być konieczne zintegrowanie zarządzania transakcjami z samodzielną aplikacją, w której musimy skonfigurować menedżera transakcji. Dzięki temu transakcja XA zapewnia spójne operacje na wielu źródłach danych, a firmy z nich korzystają.
Mamy nadzieję, że ten artykuł pomógł ci w artykule Jak robić transakcje XA (zatwierdzanie dwufazowe): prosty przewodnik. Jeśli masz inne pytania, z przyjemnością odpowiemy na Twoje; prosimy o kontakt w sekcji poniżej. Nie zapomnij się podzielić signalfix.net z rodziną i przyjaciółmi!