in de begindagen van de computing was er geen behoefte aan gedistribueerde transacties. Naarmate het aantal toepassingen toeneemt, wordt synchronisatie van de gegevens een belangrijk probleem. Bedrijven betaalden veel om gesynchroniseerde systemen te onderhouden in termen van datastroom. Als gevolg hiervan ontstond het 2 fase commit protocol, aangeduid als XA (eXtended Architecture). Dit protocol biedt ZUURACHTIGE eigenschappen voor globale transactieverwerking. In dit artikel zal ik proberen details van XA-transacties en het gebruik van XA-transacties in het kader van het voorjaar uit te leggen.
2 fase 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 transaction manager Alle transactiebronnen coördineert om te committen of af te breken. In de commit-fase besluit transaction manager om de operatie af te ronden door te committen of af te breken op basis van de stemmen van elke transactie bron. We gaan nu verder met de implementatiedetails van het 2PC-protocol.
* zie hier voor bronnen op Java+. net interoperabiliteit door middel van 2PC.
XA-transacties hebben een global transaction id en local transaction id(XID) nodig voor elke XA-bron. Elke Xa-bron wordt aangemeld bij XA Manager door de methode start (xid). Deze methode vertelt dat XA Resource betrokken is bij de transactie(wees klaar voor operaties). Daarna wordt de eerste fase van het 2pc protocol gerealiseerd door prepare(xid) methode aan te roepen. Deze methode vraagt om OK of ABORT stem van XA Resource. Na het ontvangen van stemmen van elk van XA Resource, XA Manager besluit om een commit(xid) operatie uit te voeren als alle Xa Resources sturen OK of besluit om een rollback(XID) uit te voeren als een Xa Resource stuurt ABORT. Tot slot wordt de end(xid) methode aangeroepen voor elke Xa bron die vertelt dat de transactie is voltooid. Kijk naar de figuur om het beter te begrijpen. Terwijl we een achtergrond opbouwen in de implementatie van XA-transacties, gaan we verder en zien we soorten storingen en mogelijke oplossingen.
storingen kunnen op elk moment optreden als gevolg van netwerkverlies, machine down en een administrator fout. In XA transactie, zullen we deze storingen categoriseren op basis van de fasen waarin ze zich voordoen. De eerste foutfase is voordat het protocol wordt gestart. Dit is een eenvoudige fout die het systeem niet hoeft terug te draaien of enige vorm van operatie. We doen de operatie alleen niet op dat moment. Een tweede type fout kan optreden tijdens de prepare (commit-request) fase die gemakkelijk kan worden afgehandeld door rollbacks met behulp van timeout beleid. Last but not the least is commit fase mislukkingen die kunnen optreden als gevolg van onvolledige rollbacks en elk probleem in de keten. In al deze bovenstaande situatie, transaction manager probeert het probleem te herstellen. We zullen vervolgens zien hoe transaction manager probeert om storingen te overwinnen.
voor recovery, transaction manager calls recover method of every XA resource. Xa Resources traceren de logs en probeert de nieuwste toestand opnieuw op te bouwen. Transaction Manager roept noodzakelijke rollback operaties en missie is volbracht. Dit proces kan lijken gelukkig pad, maar er zijn een heleboel uitzonderlijke situaties waar logs zijn problematisch zoals beschadigd. In dit soort situaties, transaction manager volgt een aantal heuristiek om het probleem op te lossen. Bovendien, het herstelproces is afhankelijk van de write-ahead logs waar u operatie logs schrijven voordat u van toepassing. Voor prestatieproblemen zijn deze logs geschreven in hun eigen formaat (zonder serialisatie) en het systeem moet ze beter batch indien mogelijk. We gaan vervolgens naar leuk deel dat XA transactie ondersteuning door Spring framework.Spring framework biedt een uitgebreide omgeving om web-en stand-alone-toepassingen 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 hibernate, webcontainer of een framework dat Xa Transaction Management biedt. Spring heeft JtaTransactionManager die Transaction management utilities biedt en verbergt de details. Op deze manier kunnen we transactiebeheer hebben voor meerdere DataSources die tegelijkertijd worden bijgewerkt. Als het gaat om het gebruik van Xa Transaction Management, hibernate en web containers ondersteuning voor XA transacties zijn goed gedocumenteerd, hoeft niet te worden vermeld. Echter, het werken met een framework dat XA-transacties biedt kan verwarrend zijn. Dus, Ik zal doorgaan met deze post door de invoering van Bitronix Transaction Manager.
Bitronix kan eenvoudig worden geconfigureerd en biedt goede ondersteuning voor transactiebeheer. Het wordt niet vaak gebruikt in stand-alone toepassingen, maar Ik zal proberen om de configuratie te geven voor stand-alone toepassing als volgt.
<bean factory-method="getConfiguration" class="bitronix.tm.TransactionManagerServices"> <!--Disabling Jmx avoids registering JMX Beans to any container--> <property name="disableJmx" value="true" /></bean><bean factory-method="getTransactionManager" class="bitronix.tm.TransactionManagerServices" depends-on="bitronixTMConfig" destroy-method="shutdown"/><bean class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager" ref="bitronixTM" /> <property name="userTransaction" ref="bitronixTM" /> <property name="allowCustomIsolationLevels" value="true" /></bean>
we kunnen nu meerdere gegevensbronnen hebben die als volgt kunnen worden geconfigureerd. Elke gegevensbron moet een unieke eigenschap hebben die uniek is. Onderstaande configuratie is voor Oracle, andere databases kunnen verschillende configuraties hebben. Voor elk ander detail, kunt u controleren Bitronix website.
<bean class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init" destroy-method="close"> <property name="uniqueName" value="xaDataSource" /> <property name="minPoolSize" value="1" /> <property name="maxPoolSize" value="4" /> <property name="testQuery" value="SELECT 1 FROM dual" /> <property name="driverProperties"> <props> <prop key="URL">jdbc:oracle:thin:@10.6.86.24:1521:test</prop> <prop key="user">test</prop> <prop key="password">test</prop> </props> </property> <property name="className" value="oracle.jdbc.xa.client.OracleXADataSource" /> <property name="allowLocalTransactions" value="true" /></bean>
kortom, we hebben geprobeerd om uit te leggen wat XA transacties, onderliggende protocollen en Bitronix transactie Management integratie met Spring in een stand-alone applicatie. Om uit te breiden, XA transacties biedt het wijzigen van verschillende gegevensbronnen op hetzelfde moment. Bovendien, XA transacties worden ondersteund door web containers of hibernate zoals frameworks. Het is echter mogelijk dat we transaction management moeten integreren in een zelfstandige toepassing waarin we transaction manager moeten configureren. Dientengevolge, XA transactie zorgt voor consistente operaties op meerdere gegevensbronnen en bedrijven maken gebruik van hen.
*aantekeningen van de Curator en aanvullende bronnen