i början av datoranvändning, det fanns inget behov av distribuerade transaktioner. När antalet applikationer ökade blir synkronisering av data en viktig fråga. Företag betalade mycket för att upprätthålla synkroniserade system när det gäller dataflöde. Som ett resultat uppstod 2-fasprotokollet som kallas XA(eXtended Architecture). Detta protokoll ger SYRALIKNANDE egenskaper för global transaktionsbehandling. Under hela denna artikel kommer jag att försöka förklara detaljer om xa-transaktioner och användning av XA-transaktioner i Spring framework.
2 phase commit protocol är ett atomiskt åtagandeprotokoll för distribuerade system. Detta protokoll som namnet antyder består av två faser. Den första är commit-request-fasen där transaktionshanteraren samordnar alla transaktionsresurser för att begå eller avbryta. I åtagandefasen beslutar transaktionshanteraren att slutföra operationen genom att begå eller avbryta enligt rösterna för varje transaktionsresurs. Vi kommer nästa gång att gå vidare till implementeringsdetaljer för 2PC-protokollet.
*se här för resurser på Java+. Net-interoperabilitet via 2PC.
xa-transaktioner behöver ett globalt transaktions-id och lokalt transaktions-id(xid) för varje xa-resurs. Varje xa-resurs är anlitad till xa Manager med start(xid) – metoden. Denna metod berättar att xa-resursen är involverad i transaktionen(var redo för operationer). Därefter realiseras den första fasen av 2PC-protokollet genom att anropa prepare(xid) – metoden. Denna metod begär OK eller avbryta röst från XA resurs. Efter att ha fått röst från varje xa-resurs beslutar XA Manager att utföra en commit(xid) – operation om alla xa-resurser skickar OK eller beslutar att utföra en rollback(xid) om en xa-resurs skickar avbryta. Slutligen kallas end (xid) – metoden för varje xa-resurs som säger att transaktionen är klar. Titta på figuren för att förstå bättre. När vi bygger en bakgrund i xa-transaktionsimplementering kommer vi nästa gång att gå djupare och se typer av fel och möjliga lösningar.
fel kan uppstå när som helst på grund av nätverksförlust, maskin ner och vissa administratörsfel. I xa-transaktion kommer vi att kategorisera dessa fel enligt de faser som de uppstår. Den första felfasen är innan protokollet startas. Detta är ett enkelt fel som systemet inte behöver rulla tillbaka eller någon form av operation. Vi gör bara inte operationen för det ögonblicket. Andra typen av fel kan inträffa vid förbereda (commit-request) fas som enkelt kan hanteras av rollbacks med hjälp av timeout politik. Sist men inte minst är begå fasfel som kan uppstå på grund av ofullständiga rollbacks och eventuella problem i kedjan. I alla dessa ovanstående situationer försöker transaktionshanteraren att återställa problemet. Vi kommer nästa se hur transaktionshanteraren försöker övervinna misslyckanden.
för återställning anropar transaction manager återställningsmetod för varje xa-resurs. Xa Resources spårar loggarna och försöker bygga om sitt senaste tillstånd. Transaktionshanteraren kallar nödvändiga återupprullningsoperationer och uppdrag uppnås. Denna process kan tyckas vara lycklig väg men det finns många exceptionella situationer där loggar är problematiska som att vara skadade. I sådana situationer följer transaktionshanteraren vissa heuristik för att lösa problemet. Dessutom beror återställningsprocessen på skrivningsloggarna där du skriver driftsloggar innan du ansöker. För prestandaproblem dessa loggar skrivs i sitt eget format (inte använder någon serialisering) och systemet bör bättre sats dem om möjligt. Vi går nästa till rolig del som är xa-transaktionsstöd av Spring framework.
Spring framework ger omfattande miljö för att utveckla webb-och fristående applikationer. Liksom andra verktyg det ger, xa transaktioner stöds också av våren. Detta stöd är dock inte en inbyggd implementering och kräver viloläge, webbbehållare eller ett ramverk som tillhandahåller xa-transaktionshantering. Våren har JtaTransactionManager som tillhandahåller transaktionshanteringsverktyg och döljer detaljerna. På så sätt kan vi ha transaktionshantering för flera datakällor som uppdateras samtidigt. När det gäller att använda xa transaktionshantering, viloläge och webbbehållare stöd för XA transaktioner är väl dokumenterade, behöver inte nämnas. Att arbeta med ett ramverk som ger xa-transaktioner kan dock vara förvirrande. Således kommer jag att fortsätta detta inlägg genom att introducera Bitronix Transaction Manager.
Bitronix konfigureras enkelt samtidigt som det ger bra stöd för transaktionshantering. Det används inte ofta i fristående applikationer men jag kommer att försöka ge konfiguration för fristående applikation enligt följande.
<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>
vi kan nu ha flera datakällor som kan konfigureras enligt följande. Varje datakälla ska ha en uniquename-egenskap som är unik. Nedan konfiguration är för Oracle, andra databaser kan ha olika konfigurationer. För någon annan detalj kan du kolla Bitronix webbplats.
<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>
Sammanfattningsvis har vi försökt förklara vad som är xa-transaktioner, underliggande protokoll och Bitronix Transaktionshanteringsintegration med Spring i en fristående applikation. För att förlänga tillhandahåller xa Transactions att ändra olika datakällor samtidigt. Dessutom stöds xa-transaktioner av webbcontainrar eller viloläge som ramar. Ändå kan vi behöva integrera transaktionshantering till en fristående applikation där vi måste konfigurera transaktionshanteraren. Följaktligen ger xa transaction konsekvent verksamhet på flera datakällor och företag använder dem.
*Curator anteckningar och ytterligare resurser