Jakartské transakce - Jakarta Transactions

Tyto transakce Jakarta ( JTA , dříve Java Transaction API), jeden z Jakarta EE API , umožňuje distribuované transakce, která má být provedena na více X / Open XA zdrojů v Java prostředí. JTA byla specifikace vyvinutá v rámci Java Community Process jako JSR 907. JTA poskytuje:

  • vymezení hranic transakce
  • X/Open XA API umožňující prostředkům účastnit se transakcí.

X/Otevřená architektura XA

V architektuře X/Open XA koordinuje správce transakcí nebo monitor zpracování transakcí (monitor TP) transakce mezi více prostředky, jako jsou databáze a fronty zpráv. Každý zdroj má svého vlastního správce zdrojů. Správce prostředků má obvykle vlastní API pro manipulaci se zdrojem, například JDBC API pro práci s relačními databázemi. Správce prostředků navíc umožňuje monitoru TP koordinovat distribuovanou transakci mezi vlastními a jinými správci prostředků. Konečně je tu aplikace, která komunikuje s monitorem TP pro zahájení, potvrzení nebo vrácení transakcí. Aplikace také komunikuje s jednotlivými prostředky pomocí vlastního API k úpravě prostředku.

Implementace JTA architektury X/Open XA

JTA API se skládá ze tříd ve dvou balíčcích Java :

JTA je postaven na architektuře X/Open XA, ale definuje dvě různá API pro vymezení hranic transakcí. Rozlišuje mezi aplikačním serverem , jako je server EJB, a komponentou aplikace. Poskytuje rozhraní, javax.transaction.TransactionManagerkteré používá samotný aplikační server k zahájení, potvrzení a vrácení transakcí. Poskytuje jiné rozhraní, javax.transaction.UserTransactionkteré používá obecný kód klienta, jako je servlet nebo EJB, ke správě transakcí.

Architektura JTA vyžaduje, aby každý správce prostředků musel implementovat javax.transaction.xa.XAResourcerozhraní, aby mohl být spravován monitorem TP. Jak již bylo uvedeno výše, každý prostředek bude mít své vlastní specifické API, například:

Rozhraní aplikačního programování

Jakarta Transaction API se skládá ze tří prvků: rozhraní pro vymezení transakcí na vysoké úrovni aplikace, rozhraní správce transakcí na vysoké úrovni určené pro aplikační server a standardní mapování Javy protokolu X/Open XA určeného pro správce transakčních prostředků.

Rozhraní UserTransaction

javax.transaction.UserTransactionRozhraní poskytuje aplikačním schopnost kontrolovat hranice transakcí programově. Toto rozhraní mohou používat klientské programy Java nebo fazole EJB.

UserTransaction.begin()Způsob začíná globální transakci a přidruží transakci s volající vlákno. Přidružení transakce k vláknu je transparentně spravováno Správcem transakcí.

Podpora vnořených transakcí není vyžadována. Metoda UserTransaction.begin vyvolá NotSupportedException, když je volající vlákno již přidruženo k transakci a implementace správce transakcí nepodporuje vnořené transakce.

Propagaci kontextu transakce mezi aplikačními programy zajišťují základní implementace správce transakcí na klientských a serverových počítačích. Formát kontextu transakce použitý pro šíření je závislý na protokolu a musí být sjednán mezi klientem a hostitelem serveru. Pokud je například správce transakcí implementací specifikace JTS , použije formát šíření kontextu transakce, jak je uvedeno ve specifikaci CORBA OTS 1.1. Propagace transakcí je pro aplikační programy transparentní.

@Transakční anotace

javax.transaction.TransactionalAnotace poskytuje aplikačním schopnost kontrolovat hranice transakce deklarativně. Tuto anotaci lze použít na jakoukoli třídu, kterou specifikace Jakarta EE definuje jako spravovaný fazole (který zahrnuje fazole spravované CDI).

Níže uvedený ukázkový kód ukazuje použití @Transactional ve spravovaném fazole CDI spravovaném požadavkem:

@RequestScoped
public class ExampleBean {

    @Transactional
    public void foo() { // A transaction is active here
        
        // Do work

    } // After the method returns transaction is committed or rolled back
}

Transakční chování lze konfigurovat pomocí atributu v anotaci. Dostupné možnosti přesně odrážejí specifikace EJB .

@TransactionScoped anotace

javax.transaction.TransactionScopedAnotace poskytuje aplikaci možnost prohlásit, že do rozsahu, v němž se fazole žije vázána na čas daný transakce je aktivní.

Níže uvedený ukázkový kód ukazuje použití @TransactionScoped ve spravovaném fazole spravovaném CDI s rozsahem požadavku:

@TransactionScoped
public class TxScopedBean {
    public int number;

    public int getNumber() {return number;}
    public void setNumber(int number) {this.number = number;}
}

@RequestScoped
public class ExampleBean {

    @Inject
    private TxScopedBean txScopedBean;

    @Transactional
    public void foo() {
        txScopedBean.setNumber(1);
    }

    @Transactional
    public void bar() {
        System.out.print(tXscopedBean.getNumber());
    }
}

Pokud je metoda foo () nejprve volána na spravované instanci ExampleBean a poté je volána metoda bar () , vytištěné číslo bude 0 a ne 1. Důvodem je, že každá metoda měla svou vlastní transakci, a proto vlastní instanci TxScopedBean . Číslo 1, které bylo nastaveno během volání na foo () , proto nebude během volání na bar () vidět .

Podpora UserTransaction na serveru EJB

Servery EJB jsou vyžadovány k podpoře rozhraní UserTransaction pro použití fazolemi EJB s hodnotou BEAN v javax.ejb.TransactionManagement anotaci (tomu se říká transakce spravované fazolemi nebo BMT). Rozhraní UserTransaction je vystaveno komponentám EJB buď prostřednictvím rozhraní EJBContext pomocí metody getUserTransaction, nebo přímo prostřednictvím injekce pomocí obecné @Resourceanotace. Aplikace EJB tedy nekomunikuje se správcem transakcí přímo pro vymezení transakcí; místo toho se fazole EJB spoléhá na server EJB, že poskytuje podporu pro všechny své transakční práce, jak jsou definovány ve specifikaci Jakarta Enterprise Beans. (Základní interakce mezi serverem EJB a TM je pro aplikaci transparentní; břemeno implementace správy transakcí leží na poskytovateli kontejneru a serveru EJB.)

Níže uvedený ukázkový kód ukazuje použití UserTransaction prostřednictvím transakcí spravovaných fazolemi v fazole relace EJB:

@Stateless
@TransactionManagement(BEAN)
public class ExampleBean {

    @Resource
    private UserTransaction utx;

    public void foo() {
        // start a transaction
        utx.begin();

        // Do work

        // Commit it
        utx.commit();
    }
}

Alternativně lze transakci UserTransaction získat ze SessionContext:

@Stateless
@TransactionManagement(BEAN)
public class ExampleBean {

    @Resource
    private SessionContext ctx;

    public void foo() {
        UserTransaction utx = ctx.getUserTransaction();

        // start a transaction
        utx.begin();

        // Do work

        // Commit it
        utx.commit();
    }
}

Všimněte si však, že v případě výše uvedeného příkladu, pokud je @TransactionManagement(BEAN)anotace vynechána, je transakce JTA automaticky spuštěna při každém foo()volání a je automaticky potvrzena nebo vrácena zpět při foo()ukončení. Využití UserTransaction tedy není v programování EJB nutné, ale může být potřeba pro velmi specializovaný kód.

Podpora UserTransaction v JNDI

Transakce UserTransaction by měla být k dispozici pod java:comp/UserTransaction(pokud je v prostředí nainstalována implementace JTA).

Viz také

Reference

externí odkazy