In de begindagen van de computer waren er geen gedistribueerde transacties nodig. Naarmate het aantal toepassingen toenam, werd synchronisatie van de gegevens een belangrijk punt. Bedrijven hebben veel betaald om gesynchroniseerde systemen te onderhouden in termen van gegevensstroom. Als gevolg hiervan ontstond het 2-fasen commit-protocol dat XA (eXtended Architecture) wordt genoemd. Dit protocol biedt ACID-achtige eigenschappen voor wereldwijde transactieverwerking. In dit artikel zal ik proberen de details van XA-transacties en het gebruik van XA-transacties in het Spring-framework uit te leggen.

2-fasen commit-protocol is een atomair commitment-protocol voor gedistribueerde systemen. Dit protocol bestaat, zoals de naam al aangeeft, uit twee fasen. De eerste is de commit-request-fase waarin transactiemanager alle transactiebronnen coördineert om vast te leggen of af te breken. In de vastleggingsfase besluit de transactiemanager om de operatie af te ronden door vast te leggen of af te breken volgens de stemmen van elke transactiebron. Vervolgens gaan we verder met de implementatiedetails van het 2PC-protocol.

Zie hier voor bronnen over Java + .NET Interoperabiliteit via 2PC.

XA-transacties hebben een globale transactie-ID en een lokale transactie-ID(xid) nodig voor elke XA-bron. Elke XA-resource wordt via de start(xid)-methode bij XA Manager aangemeld. Deze methode vertelt dat XA Resource betrokken is bij de transactie (klaar zijn voor operaties). Daarna wordt de eerste fase van het 2PC-protocol gerealiseerd door de prepare(xid)-methode aan te roepen. Met deze methode wordt een OK- of ABORT-stem gevraagd van XA Resource. Na het ontvangen van een stem van elk van XA Resources, besluit XA Manager om een ​​commit(xid)-operatie uit te voeren als alle XA Resources OK verzenden of besluit om een ​​rollback(xid) uit te voeren als een XA Resource ABORT stuurt. Ten slotte wordt de end(xid)-methode aangeroepen voor elk van XA Resources die aangeeft dat de transactie is voltooid. Kijk naar de figuur om het beter te begrijpen. Terwijl we een achtergrond bouwen in de implementatie van XA-transacties, zullen we vervolgens dieper gaan en dit commando typen dit commando dit commando over fouten en mogelijke oplossingen.


Storingen kunnen op elk moment optreden als gevolg van netwerkverlies, het uitvallen van de machine en een beheerdersfout. In XA-transactie categoriseren we deze storingen volgens de fasen waarin ze optreden. De eerste faalfase is voordat het protocol wordt gestart. Dit is een eenvoudige fout die het systeem niet hoeft terug te draaien of enige vorm van bewerking uit te voeren. We doen de operatie gewoon niet voor dat specifieke moment. Typ dit commando dit commando dit commando dit commando van mislukking kan optreden in de voorbereidingsfase (commit-request) die gemakkelijk kan worden afgehandeld door rollbacks met behulp van time-outbeleid. Last but not least zijn er fouten in de commit-fase die kunnen optreden als gevolg van onvolledige rollbacks en elk probleem in de keten. In al deze bovenstaande situaties probeert transactiemanager het probleem te herstellen. We zullen nu zien hoe transactiemanager mislukkingen probeert te overwinnen.

Bij herstel roept transactiebeheer de herstelmethode van elke XA-bron aan. XA Resources traceert de logboeken en probeert de laatste staat opnieuw op te bouwen. Transaction Manager roept de noodzakelijke rollback-operaties op en de missie is voltooid. Dit proces kan een gelukkig pad lijken, maar er zijn veel uitzonderlijke situaties waarin logboeken problematisch zijn, zoals beschadigd zijn. In dit soort situaties volgt transactiemanager enkele heuristieken om het probleem op te lossen. Bovendien is het herstelproces afhankelijk van de vooruitschrijflogboeken waarin u bewerkingslogboeken schrijft voordat u deze toepast. Bij prestatieproblemen worden deze logboeken in hun eigen formaat geschreven (geen serialisatie) en het systeem zou ze indien mogelijk beter moeten batchen. We gaan vervolgens naar het leuke gedeelte, namelijk XA-transactieondersteuning door Spring Framework.

Spring Framework biedt een uitgebreide omgeving om web- en stand-alone applicaties te ontwikkelen. Net als andere hulpprogramma’s die het biedt, worden XA-transacties ook ondersteund door Spring. Deze ondersteuning is echter geen native implementatie en vereist slaapstand, webcontainer of een framework dat XA Transaction Management biedt. Spring heeft JtaTransactionManager die hulpprogramma’s voor transactiebeheer biedt en de details verbergt. Op deze manier kunnen we transactiebeheer hebben voor meerdere DataSources die tegelijkertijd worden bijgewerkt. Als het gaat om het gebruik van XA-transactiebeheer, is de ondersteuning voor slaapstand en webcontainers voor XA-transacties goed gedocumenteerd en hoeven ze niet te worden vermeld. Werken met een raamwerk dat XA-transacties biedt, kan echter verwarrend zijn. Daarom zal ik deze post voortzetten door Bitronix Transaction Manager te introduceren.

Bitronix is ​​eenvoudig te configureren en biedt goede ondersteuning voor transactiebeheer. Het wordt niet vaak gebruikt in stand-alone toepassingen, maar ik zal als volgt proberen de configuratie voor stand-alone toepassingen te geven.

We kunnen nu meerdere gegevensbronnen hebben die als volgt kunnen worden geconfigureerd. Elke gegevensbron moet een eigenschap uniqueName hebben die uniek is. Onderstaande configuratie is voor Oracle, andere databases kunnen andere configuraties hebben. Voor elk ander detail kunt u de Bitronix-website raadplegen.

Samenvattend hebben we geprobeerd uit te leggen wat XA Transactions, onderliggende protocollen en Bitronix Transaction Management-integratie met Spring in een stand-alone applicatie is. Ter uitbreiding biedt XA Transactions het gelijktijdig aanpassen van verschillende databronnen. Verder worden XA-transacties ondersteund door webcontainers of hibernate-achtige frameworks. Desalniettemin moeten we mogelijk transactiebeheer integreren in een stand-alone applicatie waarin we transactiebeheer moeten configureren. Als gevolg hiervan biedt XA-transactie consistente bewerkingen op meerdere gegevensbronnen en bedrijven maken er gebruik van.
We hopen dat dit artikel je heeft geholpen met Hoe XA-transacties te doen (2-fasen commit): een eenvoudige gids. Als je nog andere vragen hebt, beantwoorden we die graag; neem dan contact met ons op in het onderstaande gedeelte. Vergeet niet te delen signalfix.net met je familie en vrienden!