Java Transaction API

A Java Transaction API (röviden JTA) a Java EE egyik API-ja. Elosztott tranzakciókat lehet vele végrehajtani XA erőforrások felett. A JTA specifikációt a Java Community Process keretében fejlesztik a JSR 907 dokumentumban. A JTA két feladata a következő:

  • A tranzakciók elhatárolása.
  • API biztosítása, amelyen keresztül az erőforrások tranzakciókban vehetnek részt. (X/Open XA API)

Az X/Open XA architektúra

A tranzakciókezelő (angolul transaction manager, transaction processing monitor, vagy röviden TP monitor) koordinálja a tranzakciókat. Minden erőforrás saját erőforráskezelővel (resource manager) rendelkezik. Az erőforráskezelő jellemzően API-t biztosít az erőforrás felé, mint például a relációs adatbázisoknál a JDBC, a másik feladata pedig, hogy lehetővé tegye a tranzakciókezelő számára az elosztott tranzakciók koordinálását a saját erőforrása és más erőforrások között. Az alkalmazás kommunikál az egyes erőforrásokkal is azok API-jain keresztül, és kommunikál a tranzakciókezelővel is, ha tranzakciót kell kezdeményezni, érvényesíteni (commit) vagy visszagörgetni (rollback).

Az X/Open XA architektúra JTA implementációja

A JTA API két java csomagból áll, nevezetesen

  • javax.transaction
  • javax.transaction.xa

A JTA az X/Open XA architektúrára alapul, de két különböző API-t is definiál a tranzakciók elhatárolására. Az egyik interfész a javax.transaction.TransactionManager, amelyet maga az alkalmazásszerver használ, a másik a javax.transaction.UserTransaction, amelyet például a servletek és az EJB-k használnak.

A JTA architektúra minden erőforráskezelőtől megköveteli, hogy implementálja a javax.transaction.xa.XAResource interfészt annak érdekében, hogy a tranzakciókezelő tudjon velük kommunikálni. A fentiekben említettek szerint minden erőforrás rendelkezik saját API-val is, például:

  • A relációs adatbázisok a JDBC API-t használják.
  • Az üzenetkezelő szolgáltatások a JMS-t használják.
  • Az általánosított EIS (Enterprise Information System) erőforrások a Java EE connector API-t használják.

A JTA részei

A javax.transaction.UserTransaction interfészen keresztül lehet tranzakciókat kezelni alkalmazáskódból. Ezt kliensprogramok és EJB komponensek szokták használni. A begin() metódusával lehet tranzakciót kezdeményezni. A tranzakciókezelő összekapcsolja a tranzakciót az adott szállal. Ez az interfész nem támogatja az egymásba ágyazott tranzakciókat, a begin() metódus NotSupportedException kivételt dob, ha a szálhoz már tartozik tranzakció.

A tranzakciós kontextus propagációját a kliensen és a szerveren lévő tranzakciókezelő-implementációk végzik. A tranzakciós kontextus formátuma protokollfüggő, a kliens és a szerver hosztoknak kell egymással megtárgyalniuk. Például ha egy tranzakciókezelő a JTS specifikáció egy implementációja, akkor a CORBA OTS 1.1 specifikáció által definiált kontextuspropagációt fogja használni. A tranzakciók propagációja az alkalmazások szemszögéből átlátszó.

UserTransaction támogatás EJB szervereken

Az EJB specifikáció is megköveteli a UserTransaction interface támogatását a TX_BEAN_MANAGED attribútumon keresztül. Az EJBContext interface getUserTransaction metódusán keresztül érhető el. Tehát az EJB alkalmazás nincs közvetlen kapcsolatban a tranzakciókezelővel, hanem az EJB komponensek az EJB szerverre hagyatkoznak a tranzakciók kezelését illetően. (Viszont az EJB szerver és a tranzakciókezelő interakciója az alkalmazás szemszögéből átlátszó.) Az alábbi kód a UserTransaction használatát mutatja be egy EJB session bean-ből (amely rendelkezik a TX_BEAN_MANAGED attribútummal):

UserTransaction utx = getSessionContext().getUserTransaction();
utx.begin();
// Műveletek.
utx.commit();

UserTransaction támogatás a JNDI-ben

A UserTransaction a java:comp/UserTransaction alatt érhető el. (Ha telepítettek JTA implementációt a környezetben.)

UserTransaction a Standard Edition-ben

Nem kell feltétlenül alkalmazásszerver a JTA használatához. Léteznek független JTA implementációk, tehát „sima” java alkalmazásban is lehet JTA/XA.

Külső hivatkozások

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!