V počátcích výpočetní techniky nebyla potřeba distribuovaných transakcí. S rostoucím počtem aplikací se synchronizace dat stala důležitým problémem. Společnosti hodně zaplatily za udržování synchronizovaných systémů z hlediska toku dat. V důsledku toho vznikl dvoufázový potvrzovací protokol označovaný jako XA (eXtended Architecture). Tento protokol poskytuje vlastnosti podobné ACID pro zpracování globálních transakcí. V tomto článku se pokusím vysvětlit podrobnosti o transakcích XA a použití transakcí XA v rámci Spring.

Dvoufázový protokol potvrzení je protokol atomického potvrzení pro distribuované systémy. Tento protokol, jak jeho název napovídá, se skládá ze dvou fází. První z nich je fáze potvrzení-žádosti, ve které správce transakcí koordinuje všechny transakční zdroje, které mají být potvrzeny nebo zrušeny. Ve fázi potvrzení transakce se manažer transakce rozhodne dokončit operaci potvrzením nebo zrušením podle hlasů každého zdroje transakce. Dále přejdeme k implementačním detailům protokolu 2PC.

Zde naleznete zdroje týkající se interoperability Java + .NET prostřednictvím 2PC.

Transakce XA potřebují globální ID transakce a místní ID transakce (xid) pro každý prostředek XA. Každý prostředek XA je zařazen do Správce XA metodou start(xid). Tato metoda říká, že XA Resource je zapojen do transakce (buďte připraveni na operace). Poté je realizována první fáze protokolu 2PC voláním metody Prepare(xid). Tato metoda vyžaduje hlasování OK nebo ABORT z XA Resource. Po obdržení hlasu od každého ze zdrojů XA se správce XA rozhodne provést operaci commit(xid), pokud všechny zdroje XA odešlou OK, nebo se rozhodne provést rollback(xid), pokud zdroj XA odešle ABORT. Nakonec je pro každý z XA Resource zavolána metoda end(xid), která oznamuje, že transakce je dokončena. Pro lepší pochopení se podívejte na obrázek. Až budeme budovat pozadí implementace transakcí XA, půjdeme dále hlouběji a uvidíme, jak napsat tento příkaz tento příkaz tento příkazy selhání a možná řešení.


K selhání může dojít kdykoli kvůli ztrátě sítě, výpadku počítače a nějaké chybě správce. V transakci XA kategorizujeme tato selhání podle fází, ve kterých k nim dochází. První fáze selhání je před spuštěním protokolu. Jedná se o jednoduchou poruchu, kterou systém nemusí vrátit zpět nebo provést jakýkoli druh operace. Prostě neprovádíme operaci pro ten konkrétní okamžik. Druhý zadejte tento příkaz tento příkaz selhání tohoto příkazu může nastat ve fázi přípravy (potvrzení-požadavek), kterou lze snadno zvládnout vrácením změn pomocí zásad časového limitu. V neposlední řadě je to selhání fáze potvrzení, ke kterému může dojít v důsledku neúplného vrácení zpět a jakéhokoli problému v řetězci. Ve všech výše uvedených situacích se správce transakcí pokusí problém vyřešit. Dále uvidíme, jak se správce transakcí snaží překonat selhání.

Při obnově volá správce transakcí metodu obnovy každého prostředku XA. Zdroje XA sledují protokoly a pokouší se znovu sestavit jejich nejnovější stav. Transaction Manager zavolá nezbytné operace vrácení zpět a mise je splněna. Tento proces se může zdát jako šťastná cesta, ale existuje mnoho výjimečných situací, kdy jsou protokoly problematické, jako je poškození. V těchto situacích transakční manažer při řešení problému postupuje podle určité heuristiky. Proces obnovy navíc závisí na protokolech pro předběžný zápis, do kterých zapisujete provozní protokoly před použitím. Při problémech s výkonem jsou tyto protokoly psány ve svém vlastním formátu (bez použití serializace) a systém by je měl pokud možno dávkovat. Dále přejdeme k zábavné části, kterou je podpora transakcí XA prostřednictvím rámce Spring.

Spring framework poskytuje rozsáhlé prostředí pro vývoj webových a samostatných aplikací. Stejně jako ostatní nástroje, které poskytuje, jsou transakce XA podporovány také Spring. Tato podpora však není nativní implementací a vyžaduje hibernaci, webový kontejner nebo framework, který poskytuje XA Transaction Management. Spring má JtaTransactionManager, který poskytuje nástroje pro správu transakcí a skrývá podrobnosti. Tímto způsobem můžeme mít správu transakcí pro více DataSources, které jsou aktualizovány současně. Pokud jde o použití XA Transaction Management, podpora hibernace a webových kontejnerů pro transakce XA jsou dobře zdokumentovány, není třeba je zmiňovat. Práce s rámcem, který poskytuje transakce XA, však může být matoucí. Proto budu pokračovat v tomto příspěvku představením Bitronix Transaction Manager.

Bitronix se snadno konfiguruje a zároveň poskytuje dobrou podporu pro správu transakcí. Není běžně používán v samostatných aplikacích, ale pokusím se poskytnout konfiguraci pro samostatnou aplikaci následovně.

Nyní můžeme mít více zdrojů dat, které lze nakonfigurovat následovně. Každý zdroj dat by měl mít vlastnost uniqueName, která je jedinečná. Níže uvedená konfigurace je pro Oracle, ostatní databáze mohou mít různé konfigurace. Na jakékoli další podrobnosti se můžete podívat na web Bitronix.

Abych to shrnul, pokusili jsme se vysvětlit, co je XA Transactions, základní protokoly a integrace Bitronix Transaction Management se Spring v samostatné aplikaci. Pro rozšíření poskytuje XA Transactions úpravu různých zdrojů dat současně. Kromě toho jsou transakce XA podporovány webovými kontejnery nebo frameworky podobnými hibernaci. Přesto možná budeme muset integrovat správu transakcí do samostatné aplikace, ve které musíme nakonfigurovat správce transakcí. V důsledku toho XA transakce poskytuje konzistentní operace na více zdrojích dat a společnosti je využívají.
Doufáme, že vám tento článek pomohl s How to Do XA Transactions (2 Phase Commit): Jednoduchý průvodce. Máte-li jakékoli další otázky, rádi vám na ně odpovíme; kontaktujte nás prosím v sekci níže. Nezapomeňte sdílet signalfix.net se svou rodinou a přáteli!