XA tranzakciók (2 fázisú elkötelezettség): egyszerű útmutató

a számítástechnika első napjaiban nem volt szükség elosztott tranzakciókra. Az alkalmazások számának növekedésével az adatok szinkronizálása fontos kérdéssé válik. A vállalatok sokat fizettek a szinkronizált rendszerek fenntartásáért az adatáramlás szempontjából. Ennek eredményeként létrejött az XA(eXtended Architecture) néven ismert 2 fázisú commit protokoll. Ez a protokoll SAVSZERŰ tulajdonságokat biztosít a globális tranzakciók feldolgozásához. Ebben a cikkben megpróbálom elmagyarázni az XA tranzakciók részleteit és az Xa tranzakciók használatát a Spring framework-ben.

a 2 fázisú commit protocol egy atomi elkötelezettségi protokoll elosztott rendszerek számára. Ez a protokoll, amint a neve is mutatja, két fázisból áll. Az első a commit-request fázis, amelyben a transaction manager koordinálja az összes tranzakciós erőforrást a kötelezettségvállaláshoz vagy a megszakításhoz. A kötelezettségvállalási szakaszban a tranzakciókezelő úgy dönt, hogy véglegesíti a műveletet az egyes tranzakciós erőforrások szavazatainak megfelelően. Mi lesz a következő lépni a végrehajtás részleteit 2pc protokoll.
* lásd itt források Java+. Net interoperabilitás keresztül 2pc.

az XA-tranzakciókhoz minden XA-erőforráshoz globális tranzakcióazonosítóra és helyi tranzakcióazonosítóra(XID) van szükség. Minden XA erőforrás az XA Manager-be kerül a start (xid) módszerrel. Ez a módszer azt mondja, hogy az XA erőforrás részt vesz a tranzakcióban(készen áll a műveletekre). Ezt követően a 2pc protokoll első fázisa a prepare(xid) módszer meghívásával valósul meg. Ez a módszer az XA erőforrásból kéri az OK vagy a szavazás megszakítását. Miután megkapta a szavazatot az egyes XA erőforrásoktól, az XA Manager úgy dönt, hogy végrehajtja a commit(xid) műveletet, ha az összes XA erőforrás OK-t küld, vagy úgy dönt, hogy végrehajtja a visszagörgetést(xid), ha EGY XA erőforrás megszakítást küld. Végül az end (xid) metódust hívják meg minden XA erőforráshoz, amely azt mondja, hogy a tranzakció befejeződött. Nézd meg az ábrát, hogy jobban megértsd. Ahogy felépítjük az XA tranzakció implementációjának hátterét, mélyebbre megyünk, és megvizsgáljuk a hibák típusait és a lehetséges megoldásokat.


hibák bármikor előfordulhatnak a hálózat elvesztése, a gép leállása és valamilyen adminisztrátori hiba miatt. Az XA tranzakció során ezeket a hibákat az előforduló fázisok szerint kategorizáljuk. Az első hibafázis a protokoll megkezdése előtt van. Ez egy egyszerű hiba, amelyet a rendszernek nem kell visszagörgetnie vagy bármilyen műveletet végrehajtania. Csak nem végezzük el a műveletet az adott pillanatban. A második típusú hiba az előkészítés(commit-request) szakaszban fordulhat elő, amelyet az időtúllépési házirendek segítségével könnyen kezelhet. Végül, de nem utolsósorban a fázishibák elkövetése, amelyek a hiányos visszagörgetések és a lánc bármely problémája miatt fordulhatnak elő. A fenti helyzetek mindegyikében a tranzakciókezelő megpróbálja helyreállítani a problémát. Ezután meglátjuk, hogy a tranzakciókezelő hogyan próbálja leküzdeni a kudarcokat.

a helyreállításhoz a tranzakciókezelő felhívja az egyes XA erőforrások helyreállítási módszerét. Az XA Resources nyomon követi a naplókat, és megpróbálja újjáépíteni a legújabb állapotát. A tranzakciókezelő felhívja a szükséges visszagörgetési műveleteket, és a küldetés megvalósul. Ez a folyamat úgy tűnik, hogy boldog utat, de van egy csomó kivételes helyzetekben, amikor naplók problematikus, mint hogy sérült. Az ilyen típusú helyzetekben a tranzakciókezelő néhány heurisztikát követ a probléma megoldására. Ezenkívül a helyreállítási folyamat az előre megírt naplóktól függ, ahová a műveleti naplókat írja az alkalmazás előtt. Teljesítményproblémák esetén ezek a naplók a saját formátumukban vannak megírva (nem használnak sorosítást), és a rendszernek jobban kell kötegelnie őket, ha lehetséges. Mi a következő megy fun rész, amely XA tranzakció támogatása Spring framework.

a Spring framework kiterjedt környezetet biztosít webes és önálló alkalmazások fejlesztéséhez. A többi általa nyújtott segédprogramhoz hasonlóan az XA tranzakciókat a Spring is támogatja. Ez a támogatás azonban nem natív megvalósítás, és hibernált, webtárolót vagy XA Tranzakciókezelést biztosító keretrendszert igényel. Spring van JtaTransactionManager amely tranzakciókezelő segédprogramok és elrejti a részleteket. Ily módon több adatforrás tranzakciókezelését is elvégezhetjük, amelyek egyszerre frissülnek. Az XA Tranzakciókezelés, a hibernate és az XA tranzakciók web containers támogatása jól dokumentált, nem kell megemlíteni. Az XA tranzakciókat biztosító keretrendszerrel való munka azonban zavaró lehet. Így folytatom ezt a bejegyzést a Bitronix Transaction Manager bevezetésével.

a Bitronix könnyen konfigurálható, miközben jó támogatást nyújt a tranzakciókezeléshez. Ez nem általánosan használt önálló alkalmazások, de megpróbálom, hogy konfiguráció önálló alkalmazás az alábbiak szerint.

<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>

most már több adatforrásunk van, amelyek az alábbiak szerint konfigurálhatók. Minden adatforrásnak rendelkeznie kell egy uniqueName tulajdonsággal, amely egyedi. Az alábbiakban a konfiguráció az Oracle számára készült, más adatbázisok különböző konfigurációkkal rendelkezhetnek. Minden más részlet, akkor ellenőrizze Bitronix honlapján.

<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>

összefoglalva, megpróbáltuk megmagyarázni, hogy mi az XA tranzakciók, az alapul szolgáló protokollok és a Bitronix Tranzakciókezelés integrációja A Spring-rel egy önálló alkalmazásban. A kiterjesztéshez az XA tranzakciók egyidejűleg különböző adatforrásokat módosítanak. Ezenkívül az XA tranzakciókat webtárolók vagy hibernált keretek támogatják. Ennek ellenére előfordulhat, hogy integrálnunk kell a tranzakciókezelést egy önálló alkalmazásba, amelyben konfigurálnunk kell a tranzakciókezelőt. Ennek következtében az XA transaction következetes műveleteket biztosít több adatforráson, és a vállalatok ezeket használják.
* kurátori jegyzetek és további források

You might also like

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.