Under de första dagarna av datoranvändning fanns det inget behov av distribuerade transaktioner. När antalet applikationer ökade blir synkronisering av data en viktig fråga. Företag betalade mycket för att underhålla synkroniserade system när det gäller dataflöde. Som ett resultat uppstod det 2-fas commit-protokollet kallat XA (eXtended Architecture). Detta protokoll tillhandahåller ACID-liknande egenskaper för global transaktionsbearbetning. I den här artikeln kommer jag att försöka förklara detaljer om XA-transaktioner och användningen av XA-transaktioner i Spring-ramverket.

2 phase commit protokoll är ett atomärt åtagandeprotokoll för distribuerade system. Detta protokoll består som namnet antyder av två faser. Den första är commit-request-fasen i vilken transaktionshanteraren koordinerar alla transaktionsresurser för att begå eller avbryta. I commit-fasen beslutar transaktionshanteraren att slutföra operationen genom att begå eller avbryta enligt rösterna för varje transaktionsresurs. Vi kommer härnäst att gå vidare till implementeringsdetaljerna för 2PC-protokollet.

Se här för resurser om Java + .NET interoperabilitet genom 2PC.

XA-transaktioner behöver ett globalt transaktions-id och ett lokalt transaktions-id(xid) för varje XA-resurs. Varje XA-resurs värvas till XA Manager med start(xid)-metoden. Den här metoden talar om att XA Resource är involverad i transaktionen (var redo för operationer). Därefter realiseras den första fasen av 2PC-protokollet genom att anropa prepare(xid)-metoden. Denna metod begär OK eller AVBRYT röst från XA Resource. Efter att ha mottagit röster från var och en av XA-resurserna, beslutar XA Manager att utföra en commit(xid)-operation om alla XA-resurser skickar OK eller beslutar sig för att utföra en rollback(xid) om en XA-resurs skickar AVBORT. Slutligen anropas end(xid)-metoden för var och en av XA Resource som berättar att transaktionen är slutförd. Titta på figuren för att förstå bättre. När vi bygger en bakgrund i XA-transaktionsimplementering kommer vi nästa gång att gå djupare och se skriv det här kommandot det här kommandot som ger fel och möjliga lösningar.


Fel kan uppstå när som helst på grund av nätverksbortfall, maskinstopp och vissa administratörsmisstag. I XA-transaktioner kommer vi att kategorisera dessa fel enligt de faser de inträffar. Den första felfasen är innan protokollet startas. Detta är ett enkelt fel som systemet inte behöver rulla tillbaka eller någon form av operation. Vi gör helt enkelt inte operationen för just det ögonblicket. Andra typ av detta kommando detta kommando detta kommando av misslyckande kan inträffa i prepare(commit-request) fas som enkelt kan hanteras genom återställning med timeout-policyer. Sist men inte minst är commit-fasfel som kan uppstå på grund av ofullständiga rollbacks och eventuella problem i kedjan. I alla dessa ovanstående situationer försöker transaktionshanteraren åtgärda problemet. Vi kommer härnäst att se hur transaktionshanteraren försöker övervinna misslyckanden.

Vid återställning anropar transaktionshanteraren återställningsmetoden för varje XA-resurs. XA Resources spårar loggarna och försöker återskapa dess senaste skick. Transaction Manager anropar nödvändiga återställningsoperationer och uppdraget är utfört. Denna process kan tyckas vara lycklig men det finns många exceptionella situationer där loggar är problematiska som att vara korrupta. I dessa typer av situationer följer transaktionshanteraren vissa heuristik för att lösa problemet. Återställningsprocessen beror dessutom på skriv-ahead-loggarna där du skriver operationsloggar innan du ansöker. När det gäller prestandaproblem är dessa loggar skrivna i sitt eget format (utan att använda någon serialisering) och systemet bör batcha dem bättre om möjligt. Vi går sedan till den roliga delen som är XA-transaktionsstöd med Spring-ramverket.

Spring framework ger en omfattande miljö för att utveckla webb- och fristående applikationer. Precis som andra verktyg som det tillhandahåller, stöds även XA-transaktioner av Spring. Detta stöd är dock inte en inbyggd implementering och kräver viloläge, webbbehållare eller ett ramverk som tillhandahåller XA Transaction Management. Spring har JtaTransactionManager som tillhandahåller transaktionshanteringsverktyg och döljer detaljerna. På så sätt kan vi ha transaktionshantering för flera datakällor som uppdateras samtidigt. När det kommer till användning av XA Transaction Management, viloläge och webbcontainers stöd för XA-transaktioner är väldokumenterat, behöver inte nämnas. Att arbeta med ett ramverk som tillhandahåller XA-transaktioner kan dock vara förvirrande. Därför kommer jag att fortsätta detta inlägg genom att introducera Bitronix Transaction Manager.

Bitronix är lätt att konfigurera samtidigt som det ger bra stöd för transaktionshantering. Det används inte ofta i fristående applikationer men jag kommer att försöka ge konfigurationen för fristående applikation enligt följande.

Vi kan nu ha flera datakällor som kan konfigureras enligt följande. Varje datakälla bör ha en uniqueName-egenskap som är unik. Nedanstående konfiguration är för Oracle, andra databaser kan ha andra konfigurationer. På alla andra detaljer kan du kolla Bitronix webbplats.

Sammanfattningsvis har vi försökt förklara vad XA Transactions är, underliggande protokoll och Bitronix Transaction Management-integration med Spring i en fristående applikation. För att utöka erbjuder XA Transactions modifiering av olika datakällor samtidigt. Dessutom stöds XA Transactions av webbbehållare eller vilolägesliknande ramverk. Ändå kan vi behöva integrera transaktionshantering i en fristående applikation där vi måste konfigurera transaktionshanteraren. Som en konsekvens ger XA-transaktionen konsekvent verksamhet på flera datakällor och företag använder dem.
Vi hoppas att den här artikeln hjälpte dig med How to Do XA Transactions (2 Phase Commit): A Simple Guide. Om du har några andra frågor svarar vi gärna på dina; vänligen kontakta oss i avsnittet nedan. Glöm inte att dela signalfix.net med din familj och dina vänner!