in the early days of computing, there was no need for distributed transactions. Sovellusten määrän kasvaessa datan synkronoinnista tuli tärkeä asia. Yhtiöt maksoivat paljon synkronoitujen järjestelmien ylläpidosta tiedonkulun suhteen. Tämän seurauksena syntyi xa(eXtended Architecture) – nimellä kutsuttu 2 phase commit protocol. Tämä protokolla tarjoaa happamat ominaisuudet maailmanlaajuiselle tapahtumankäsittelylle. Koko tämän artikkelin, yritän selittää yksityiskohtia XA liiketoimia ja käyttöä Xa liiketoimia kevään puitteissa.
2 phase commit protocol on hajautettujen järjestelmien atomisitoumusprotokolla. Tämä pöytäkirja nimensä mukaisesti koostuu kahdesta vaiheesta. Ensimmäinen on commit-request-vaihe, jossa transaction manager koordinoi kaikki transaction-resurssit toimitettavaksi tai keskeytettäväksi. Commit-vaiheessa transaction manager päättää viimeistellä operaation sitouttamalla tai keskeyttämällä sen kunkin transaktioresurssin äänten mukaan. Seuraavaksi siirrymme 2PC-protokollan toteutuksen yksityiskohtiin.
*katso täältä resurssit Java +. Net-yhteentoimivuuteen 2PC: n kautta.
xa-transaktiot tarvitsevat globaalin transaktiotunnuksen ja paikallisen transaktiotunnuksen(XID) jokaiselle XA-resurssille. Jokainen Xa resurssi värvätään xa Manageriin start (xid) – menetelmällä. Tämä menetelmä kertoo, että xa Resource on mukana transaktiossa(ole valmis operaatioihin). Tämän jälkeen 2PC-protokollan ensimmäinen vaihe toteutetaan kutsumalla prepe(xid) – menetelmää. Tämä menetelmä pyytää OK-tai ABORT-äänestystä xa-resurssista. Saatuaan äänioikeuden jokaisesta Xa-resurssista, Xa Manager päättää suorittaa commit(xid) – toiminnon, jos kaikki Xa-resurssit lähettävät OK, tai päättää suorittaa rollback (xid) – toiminnon, jos Xa-resurssi lähettää keskeytyksen. Lopuksi, end (xid) menetelmä kutsutaan kunkin Xa resurssi kertoo, että tapahtuma on valmis. Katso luku ymmärtää paremmin. Kun rakennamme taustaa xa transaktion toteutuksessa, menemme seuraavaksi syvemmälle ja näemme erilaisia epäonnistumisia ja mahdollisia ratkaisuja.
epäonnistumisia voi esiintyä milloin tahansa johtuen verkon menetyksestä, koneesta ja jostain ylläpitäjän virheestä. Xa transaktiossa luokittelemme nämä epäonnistumiset niiden vaiheiden mukaan, joita ne tapahtuvat. Ensimmäinen vikavaihe on ennen protokollan käynnistämistä. Tämä on yksinkertainen vika, että järjestelmä ei tarvitse rollback tai minkäänlaista toimintaa. Emme vain tee leikkausta juuri sillä hetkellä. Toinen vikatyyppi voi ilmetä valmisteluvaiheessa (commit-request), joka voidaan helposti käsitellä palautuksilla aikakatkaisukäytäntöjen avulla. Viimeisenä mutta ei vähäisimpänä on commit-vaiheen epäonnistumisia, joita voi esiintyä puutteellisten palautusten ja ketjuongelmien vuoksi. Kaikissa näissä edellä tilanteessa, transaction manager yrittää palauttaa ongelman. Seuraavaksi näemme, miten transaction manager yrittää voittaa epäonnistumisia.
palautusta varten transaction manager kutsuu kunkin xa-resurssin palautusmenetelmää. Xa Resources jäljittää lokit ja yrittää rakentaa uusimman tilansa uudelleen. Transaction Manager kutsuu tarvittavat palautusoperaatiot ja tehtävä on suoritettu. Tämä prosessi voi tuntua onnellinen polku, mutta on olemassa paljon poikkeuksellisia tilanteita, joissa lokit ovat ongelmallisia kuin vioittunut. Tällaisissa tilanteissa transaction manager seuraa joitakin heuristiikkaa ongelman ratkaisemiseksi. Lisäksi, toipuminen riippuu write-ahead lokit jossa kirjoitat toimintalokit ennen hakemista. Suorituskyvyn kysymyksiä nämä lokit on kirjoitettu omassa muodossa (ei käytä mitään serialization) ja järjestelmän pitäisi paremmin erän niitä, jos mahdollista. Seuraavaksi siirrymme hauska osa, joka on Xa transaction tuki Spring framework.
Spring framework tarjoaa laajan ympäristön verkko-ja erillissovellusten kehittämiseen. Kuten muutkin sen tarjoamat apuohjelmat, myös Spring tukee xa-tapahtumia. Tämä tuki ei kuitenkaan ole natiivi toteutus ja vaatii hibernate, web container tai puitteet, jotka tarjoavat Xa Transaktiohallinnan. Keväällä on JtaTransactionManager, joka tarjoaa tapahtumien hallinta apuohjelmia ja piilottaa yksityiskohdat. Tällä tavoin voimme hallita tapahtumia useille tietolähteille, jotka päivitetään samanaikaisesti. Kun se tulee käyttää XA Transaction Management, hibernate ja web containers tukea XA transactions ovat hyvin dokumentoitu, ei tarvitse mainita. Xa-transaktioita tarjoavan kehyksen kanssa työskentely voi kuitenkin olla hämmentävää. Näin, aion jatkaa tätä viestiä esittelemällä Bitronix Transaction Manager.
Bitronix on helposti konfiguroitavissa ja tarjoaa hyvää tukea tapahtumien hallintaan. Se ei ole yleisesti käytetty stand alone sovelluksia, mutta yritän antaa kokoonpano stand-alone sovellus seuraavasti.
<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>
meillä voi nyt olla useita tietolähteitä, jotka voidaan konfiguroida seuraavasti. Jokaisella tietolähteellä olisi oltava ainutlaatuinen nimi, joka on ainutlaatuinen. Alla kokoonpano on Oracle, muut tietokannat voivat olla erilaisia kokoonpanoja. Muita yksityiskohtia voit tarkistaa Bitronixin verkkosivuilta.
<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>
yhteenvetona, olemme yrittäneet selittää, mikä on XA-transaktiot, taustalla olevat protokollat ja Bitronix-Transaktiohallinnan integrointi Springiin erillisessä sovelluksessa. Xa Transactions-toiminto mahdollistaa eri tietolähteiden muokkaamisen yhtä aikaa. Lisäksi, XA tapahtumia tuetaan web containers tai hibernate kuten kehyksiä. Kuitenkin, voimme joutua integroimaan transaction management itsenäinen sovellus, jossa meidän täytyy määrittää transaction manager. Tämän seurauksena xa transaction tarjoaa johdonmukaista toimintaa useissa tietolähteissä ja yritykset hyödyntävät niitä.
* kuraattorin muistiinpanot ja lisäresurssit