I de tidlige dage af computing var der ikke behov for distribuerede transaktioner. Efterhånden som antallet af applikationer steg, bliver synkronisering af dataene et vigtigt emne. Virksomheder betalte meget for at vedligeholde synkroniserede systemer med hensyn til dataflow. Som et resultat opstod den 2-fasede commit-protokol omtalt som XA (eXtended Architecture). Denne protokol giver ACID-lignende egenskaber til global transaktionsbehandling. Igennem denne artikel vil jeg forsøge at forklare detaljer om XA-transaktioner og brug af XA-transaktioner i Spring-ramme.

2 phase commit protokol er en atomic commitment protokol for distribuerede systemer. Denne protokol, som navnet antyder, består af to faser. Den første er commit-request-fase, hvor transaktionsadministratoren koordinerer alle transaktionsressourcer for at begå eller afbryde. I commit-fasen beslutter transaktionsadministratoren at afslutte driften ved at begå eller afbryde i henhold til stemmerne fra hver transaktionsressource. Vi vil derefter gå videre til implementeringsdetaljerne for 2PC-protokollen.

Se her for ressourcer om Java + .NET interoperabilitet gennem 2PC.

XA-transaktioner skal have et globalt transaktions-id og et lokalt transaktions-id(xid) for hver XA-ressource. Hver XA-ressource er tilknyttet XA Manager ved start(xid)-metoden. Denne metode fortæller, at XA Resource er involveret i transaktionen (vær klar til operationer). Derefter realiseres den første fase af 2PC-protokollen ved at kalde prepare(xid)-metoden. Denne metode anmoder om OK eller AFBRYD stemme fra XA Resource. Efter at have modtaget afstemning fra hver af XA-ressourcer, beslutter XA Manager at udføre en commit(xid)-operation, hvis alle XA-ressourcer sender OK, eller beslutter at udføre en rollback(xid), hvis en XA-ressource sender AFBRYD. Til sidst kaldes end(xid)-metoden for hver af XA-ressourcer, der fortæller, at transaktionen er gennemført. Se på figuren for at forstå det bedre. Efterhånden som vi bygger en baggrund i XA-transaktionsimplementering, vil vi næste gang gå dybere og se skriv denne kommando denne kommando kommandoer over fejl og mulige løsninger.


Fejl kan opstå når som helst på grund af netværkstab, maskine nede og nogle administratorfejl. I XA-transaktion vil vi kategorisere disse fejl i henhold til de faser, de opstår. Den første fejlfase er før protokollen startes. Dette er en simpel fejl, som systemet ikke behøver at rulle tilbage eller nogen form for drift. Vi udfører bare ikke operationen for det pågældende øjeblik. Anden type denne kommando denne kommando denne kommando om fejl kan forekomme i forberedelsesfasen (forpligtelse-anmodning), som let kan håndteres ved tilbagerulninger ved hjælp af timeout-politikker. Sidst men ikke mindst er commit-fasefejl, som kan opstå på grund af ufuldstændige rollbacks og ethvert problem i kæden. I alle disse ovenstående situationer forsøger transaktionsadministrator at løse problemet. Vi vil næste gang se, hvordan transaktionsadministrator forsøger at overvinde fejl.

Ved gendannelse kalder transaktionsadministratoren gendannelsesmetode for hver XA-ressource. XA Resources sporer logfilerne og forsøger at genopbygge dens seneste tilstand. Transaction Manager kalder nødvendige rollback-operationer, og missionen er fuldført. Denne proces kan synes at være en lykkelig vej, men der er mange ekstraordinære situationer, hvor logfiler er problematiske som at blive beskadiget. I denne slags situationer følger transaktionsadministrator nogle heuristika for at løse problemet. Desuden afhænger gendannelsesprocessen af ​​de fremskrivningslogfiler, hvor du skriver operationslogfiler, før du anvender. Ved problemer med ydeevnen er disse logs skrevet i deres eget format (ikke ved hjælp af nogen serialisering), og systemet burde bedre batch dem, hvis det er muligt. Vi går derefter til den sjove del, som er XA-transaktionsstøtte ved Spring framework.

Spring framework giver et omfattende miljø til at udvikle web- og stand alone-applikationer. Ligesom andre hjælpeprogrammer, det leverer, understøttes XA-transaktioner også af Spring. Denne support er dog ikke en indbygget implementering og kræver dvale, webcontainer eller en ramme, der giver XA Transaction Management. Spring har JtaTransactionManager, der leverer transaktionsstyringsværktøjer og skjuler detaljerne. På denne måde kan vi have transaktionsstyring for flere datakilder, som opdateres samtidigt. Når det kommer til brug af XA Transaction Management, er dvale- og webcontainere understøttelse af XA-transaktioner veldokumenterede, behøver ikke at nævnes. Det kan dog være forvirrende at arbejde med en ramme, der giver XA-transaktioner. Derfor vil jeg fortsætte dette indlæg ved at introducere Bitronix Transaction Manager.

Bitronix er nemt at konfigurere, samtidig med at det giver god support til transaktionsstyring. Det er ikke almindeligt brugt i selvstændige applikationer, men jeg vil forsøge at give konfiguration til selvstændig applikation som følger.

Vi kan nu have flere datakilder, som kan konfigureres som følger. Hver datakilde skal have en uniqueName-egenskab, som er unik. Nedenstående konfiguration er for Oracle, andre databaser kan have andre konfigurationer. På enhver anden detalje kan du tjekke Bitronix hjemmeside.

For at opsummere har vi forsøgt at forklare, hvad der er XA Transactions, underliggende protokoller og Bitronix Transaction Management-integration med Spring i en selvstændig applikation. For at udvide giver XA Transactions mulighed for at ændre forskellige datakilder på samme tid. Ydermere understøttes XA-transaktioner af webcontainere eller dvale-lignende rammer. Ikke desto mindre kan vi være nødt til at integrere transaktionsstyring i en selvstændig applikation, hvor vi skal konfigurere transaktionsstyring. Som følge heraf giver XA-transaktionen konsistente operationer på flere datakilder, og virksomheder gør brug af dem.
Vi håber, at denne artikel hjalp dig med Sådan gør du XA-transaktioner (2 Phase Commit): En enkel vejledning. Hvis du har andre spørgsmål, svarer vi gerne på dine; kontakt os venligst i afsnittet nedenfor. Glem ikke at dele signalfix.net med din familie og venner!