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:
- relační databáze používají JDBC
- služby zasílání zpráv používají JMS
- zobecněné prostředky EIS ( Enterprise Information System ) používají rozhraní Java EE Connector API .
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).