I de tidlige dagene med databehandling var det ikke behov for distribuerte transaksjoner. Etter hvert som antall applikasjoner økte, blir synkronisering av dataene et viktig tema. Bedrifter betalte mye for å vedlikeholde synkroniserte systemer når det gjelder dataflyt. Som et resultat oppsto 2-fase commit-protokollen referert til som XA (eXtended Architecture). Denne protokollen gir ACID-lignende egenskaper for global transaksjonsbehandling. Gjennom denne artikkelen vil jeg prøve å forklare detaljer om XA-transaksjoner og bruk av XA-transaksjoner i Spring-rammeverket.

2 phase commit protocol er en atomic commitment protokoll for distribuerte systemer. Denne protokollen består som navnet tilsier av to faser. Den første er commit-request-fasen der transaksjonslederen koordinerer alle transaksjonsressursene for å begå eller avbryte. I forpliktelsesfasen bestemmer transaksjonslederen seg for å fullføre operasjonen ved å forplikte eller avbryte i henhold til stemmene til hver transaksjonsressurs. Vi vil deretter gå videre til implementeringsdetaljer for 2PC-protokollen.

Se her for ressurser om Java + .NET interoperabilitet gjennom 2PC.

XA-transaksjoner trenger en global transaksjons-ID og lokal transaksjons-ID(xid) for hver XA-ressurs. Hver XA-ressurs er vervet til XA Manager ved start(xid)-metoden. Denne metoden forteller at XA Resource blir involvert i transaksjonen (vær klar for operasjoner). Etter det realiseres den første fasen av 2PC-protokollen ved å kalle prepare(xid)-metoden. Denne metoden ber om OK eller AVBRYT stemme fra XA Resource. Etter å ha mottatt stemme fra hver av XA Resource, bestemmer XA Manager å utføre en commit(xid) operasjon hvis alle XA Resources sender OK eller bestemmer seg for å utføre en rollback(xid) hvis en XA Resource sender AVBRYT. Til slutt kalles end(xid)-metoden for hver av XA Resource som forteller at transaksjonen er fullført. Se på figuren for å forstå bedre. Ettersom vi bygger en bakgrunn i XA-transaksjonsimplementering, vil vi gå dypere og se skriv denne kommandoen denne kommandoen denne kommandoen over feil og mulige løsninger.


Feil kan oppstå når som helst på grunn av nettverkstap, maskinnedgang og noen administratorfeil. I XA-transaksjoner vil vi kategorisere disse feilene i henhold til fasene de oppstår. Den første feilfasen er før protokollen startes. Dette er en enkel feil som systemet ikke trenger å rulle tilbake eller noen form for operasjon. Vi gjør bare ikke operasjonen for det aktuelle øyeblikket. Andre type denne kommandoen denne kommandoen denne kommandoen om feil kan oppstå i forberedelsesfasen (commit-request) som enkelt kan håndteres ved tilbakeføringer ved bruk av tidsavbruddspolicyer. Sist men ikke minst er commit-fasefeil som kan oppstå på grunn av ufullstendige tilbakeføringer og eventuelle problemer i kjeden. I alle disse situasjonene ovenfor prøver transaksjonsleder å gjenopprette problemet. Vi vil neste se hvordan transaksjonsleder prøver å overvinne feil.

Ved gjenoppretting kaller transaksjonssjefen gjenopprettingsmetoden for hver XA-ressurs. XA Resources sporer loggene og prøver å gjenoppbygge den nyeste tilstanden. Transaction Manager kaller nødvendige rollback-operasjoner og oppdraget er fullført. Denne prosessen kan virke som en lykkelig vei, men det er mange eksepsjonelle situasjoner der logger er problematiske som å bli ødelagt. I slike situasjoner følger transaksjonsleder noen heuristikk for å løse problemet. Videre avhenger gjenopprettingsprosessen av fremskrivningsloggene der du skriver operasjonslogger før du søker. Ved ytelsesproblemer er disse loggene skrevet i sitt eget format (ikke ved hjelp av noen serialisering), og systemet bør batch dem bedre hvis mulig. Vi går videre til den morsomme delen som er XA-transaksjonsstøtte etter Spring-rammeverket.

Spring-rammeverket gir et omfattende miljø for å utvikle web- og frittstående applikasjoner. I likhet med andre verktøy den tilbyr, støttes også XA-transaksjoner av Spring. Denne støtten er imidlertid ikke en innebygd implementering og krever dvalemodus, nettbeholder eller et rammeverk som gir XA Transaction Management. Spring har JtaTransactionManager som gir transaksjonsadministrasjonsverktøy og skjuler detaljene. På denne måten kan vi ha transaksjonsstyring for flere datakilder som oppdateres samtidig. Når det gjelder bruk av XA Transaction Management, er dvalemodus og webcontainere støtte for XA-transaksjoner godt dokumentert, trenger ikke å nevnes. Å jobbe med et rammeverk som gir XA-transaksjoner kan imidlertid være forvirrende. Derfor vil jeg fortsette dette innlegget ved å introdusere Bitronix Transaction Manager.

Bitronix er enkelt å konfigurere samtidig som det gir god støtte for transaksjonshåndtering. Det er ikke ofte brukt i frittstående applikasjoner, men jeg vil prøve å gi konfigurasjon for frittstående applikasjoner som følger.

Vi kan nå ha flere datakilder som kan konfigureres som følger. Hver datakilde skal ha en uniqueName-egenskap som er unik. Konfigurasjonen nedenfor er for Oracle, andre databaser kan ha andre konfigurasjoner. På alle andre detaljer kan du sjekke Bitronix-nettstedet.

For å oppsummere har vi forsøkt å forklare hva som er XA Transactions, underliggende protokoller og Bitronix Transaction Management-integrasjon med Spring i en frittstående applikasjon. For å utvide gir XA Transactions modifisering av forskjellige datakilder samtidig. Videre støttes XA Transactions av nettcontainere eller dvale-lignende rammer. Ikke desto mindre kan det hende vi må integrere transaksjonsadministrasjon i en frittstående applikasjon der vi må konfigurere transaksjonsbehandling. Som en konsekvens gir XA-transaksjoner konsistente operasjoner på flere datakilder, og selskaper bruker dem.
Vi håper denne artikkelen hjalp deg med How to Do XA Transactions (2 Phase Commit): A Simple Guide. Hvis du har andre spørsmål, svarer vi gjerne på dine; vennligst kontakt oss i avsnittet nedenfor. Ikke glem å dele signalfix.net med familie og venner!