API Java Transaction

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Java Transaction API ( JTA ) este una dintre API - urile oferite de Java EE (Java Enterprise Edition) și este destinată să permită tranzacții distribuite , efectuate pe mai multe resurse X / Open XA într-un mediu Java . JTA este o specificație dezvoltată sub directivele procesului comunitar Java sub denumirea de JSR 907 . JTA prevede:

  • o delimitare a limitelor tranzacției.
  • din API-urile X / Open XA care permit resurselor să participe la tranzacții.

Arhitectura X / Open XA

În această arhitectură, un manager de tranzacții sau un monitor de procesare a tranzacțiilor (monitor TP) coordonează tranzacțiile între mai multe resurse, cum ar fi baze de date sau cozi de mesaje. Fiecare resursă are propriul manager de resurse. Resource Manager folosește de obicei propriile API-uri pentru a manipula resurse, cum ar fi să facă API-urile JDBC să funcționeze cu baze de date relaționale. Resource Manager permite, de asemenea, unui monitor TP să coordoneze o tranzacție distribuită între el și alți manageri de resurse. În cele din urmă, aplicația care comunică cu monitorul TP intră în acțiune pentru a efectua operațiuni tipice de tranzacție, cum ar fi start (begin), commit și rollback . Aplicația comunică, de asemenea, cu resurse individuale pentru a le modifica, utilizând propriul API.

Implementarea JTA în arhitectura X / Open XA

API-ul JTA constă dintr-o serie de clase împărțite în următoarele două pachete Java :

JTA este construit pe modelul arhitecturii X / Open XA, dar definește două API-uri diferite pentru delimitarea limitelor tranzacțiilor. Se face distincția între un server de aplicații, cum ar fi un server EJB și o componentă a aplicației. Oferă o interfață javax.transaction.TransactionManager , care este utilizată de serverul de aplicații propriu-zis pentru efectuarea tranzacțiilor, comiterile și restabilirile . De asemenea, oferă o interfață diferită, javax.transaction.UserTransaction , care este utilizată de codul client generic, cum ar fi un servlet sau EJB, pentru a gestiona tranzacțiile.

Arhitectura JTA necesită ca fiecare Resource Manager să implementeze interfața javax.transaction.xa.XAResource pentru a fi gestionată de monitorul TP. După cum s-a explicat mai sus, fiecare resursă va avea propriul API specific, de exemplu:

  • Bazele de date relaționale utilizează JDBC
  • Serviciile de mesagerie utilizează JMS
  • Resursele sistemului informațional generalizat pentru întreprindere (EIS) utilizează arhitectura conectorului Java EE.

API Java Transaction

API-ul Java Transaction este format din trei elemente: o interfață de demarcare a tranzacțiilor la nivel înalt în aplicație, o interfață întotdeauna la nivel înalt Transaction Manager și o mapare Java standard a protocolului X / Open XA destinat unui Manager de resurse tranzacțional.

Interfață UserTransaction

Interfața javax.transaction.UserTransaction oferă aplicației posibilitatea de a verifica programatic limitele tranzacțiilor. Această interfață poate fi utilizată de programele Java din partea clientului sau de beanele EJB.

Metoda begin () începe o tranzacție globală și o asociază cu firul de apelare. Asocierea tranzacție cu fir este gestionată în mod transparent de către Transaction Manager.

Nu este necesară asistență pentru tranzacțiile imbricate. Metoda begin () lansează NotSupportedException atunci când firul este deja asociat cu o tranzacție și implementarea Transaction Manager nu acceptă tranzacții imbricate.

Contextul în care tranzacția se propagă între aplicații este atribuit de implementările de fundal ale Managerilor de tranzacții pe mașinile client și server. Formatul de context utilizat pentru propagare depinde de protocol și trebuie negociat între client și server gazdă. De exemplu, dacă Managerul de tranzacții este o implementare a specificației JTS , acesta îl va folosi pe cel specificat în CORBA OTS 1.1. Propagarea tranzacției este transparentă pentru aplicație.

@ Adnotare tranzacțională

Adnotarea javax.transaction.Transactional oferă aplicației posibilitatea de a verifica în mod declarativ limitele tranzacțiilor. Această adnotare poate fi aplicată oricărei clase pe care Java EE o definește ca un bean gestionat (care include bean gestionat CDI).

Exemplul de cod de mai jos ilustrează utilizarea @Transactional într-un domeniu în care sunt necesare fasole gestionate de CDI:

 @RequestScoped
clasă publică ExampleBean {

    @Transacțional
    public void foo () { // Tranzacția de aici este activă
        
        // Rulați un cod

    } // După returnare, tranzacția este angajată sau restabilită
}

Comportamentul tranzacției poate fi configurat cu un atribut în adnotare.

Adnotare @TransactionScoped

Adnotarea javax.transaction.TransactionScoped oferă aplicației posibilitatea de a declara că domeniul în care trăiește un Bean este legat de timpul în care este activă o anumită tranzacție.

Exemplul de cod de mai jos arată utilizarea @TransactionScoped într-un domeniu în care sunt necesare fasole gestionate CDI:

 @TransactionScoped
clasă publică TxScopedBean {
    Numărul public int;

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

@RequestScoped
clasă publică ExampleBean {

    @Injecta
    private TxScopedBean txScopedBean ;

    @Transacțional
    public voo foo () {
        txScopedBean . setNumber ( 1 );
    }

    @Transacțional
    public void bar () {
        Sistem . afară . print ( tXscopedBean . getNumber ());
    }
}

Dacă metoda foo () este apelată mai întâi pe o instanță gestionată a ExampleBean și apoi se apelează metoda bar () , numărul imprimat pe ecran va fi 0 și nu 1. Acest lucru se datorează faptului că fiecare metodă are propria tranzacție și, prin urmare, propria instanță a TxScopedBean. Numărul 1 care este atribuit în timpul apelului către foo () nu va fi, prin urmare, vizibil în timpul apelului către bar () .

Suport pentru tranzacții utilizator pe serverele EJB

Serverele EJB sunt necesare pentru a accepta interfața UserTransaction pentru a fi folosită de beans EJB cu valoarea BEAN în adnotarea javax.ejb.TransactionManagement (aceasta se numește tranzacție gestionată de bean sau BMT). Interfața UserTransaction este expusă componentelor EJB atât prin interfața EJBContext utilizând metoda getUserTransaction, cât și direct folosind adnotarea @Resource generică. Prin urmare, o aplicație EJB nu interacționează direct cu Transaction Manager pentru demarcarea tranzacțiilor; în schimb, fasolele EJB se bazează pe serverul EJB pentru a oferi suport pentru toate operațiunile sale tranzacționale, așa cum sunt definite în Enterprise JavaBeans Specification. (Interacțiunea de bază dintre EJB Server și TM este transparentă pentru aplicație; sarcina implementării gestionării tranzacțiilor revine furnizorului de containere și server EJB.)

Exemplul de cod de mai jos demonstrează utilizarea UserTransaction prin tranzacții gestionate de bean într-o sesiune EJB Bean:

 @Fara stare
@TransactionManagement ( BEAN )
clasă publică ExampleBean {

    @Resursă
    private UserTransaction utx ;

    public voo foo () {
        // începe o tranzacție
        utx . begin ();

        // Munceste

        // Angajează-l
        utx . commit ();
    }
}

Alternativ, UserTransaction poate fi obținut din SessionContext :

 @Fara stare
@TransactionManagement ( BEAN )
clasă publică ExampleBean {

    @Resursă
    private SessionContext ctx ;

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

        // începe o tranzacție
        utx . begin ();

        // Munceste

        // Angajează-l
        utx . commit ();
    }
}

Rețineți că, în exemplu, dacă adnotarea @TransactionManagement (BEAN) ar fi fost omisă, o tranzacție JTA ar fi început automat ori de câte ori se apelează foo () și, din nou automat, o comitere și o revenire ar avea loc la ieșirea din foo () . Prin urmare, utilizarea unei tranzacții utilizator nu este necesară în programarea EJB, dar poate fi necesară într-un cod mai specializat.

Suport pentru tranzacții utilizator în JNDI

UserTransaction este disponibil sub java: comp / UserTransaction , dacă în mediul dvs. este instalată o implementare JTA.

Implementări open source pentru JTA

Unele implementări open source pentru JTA sunt enumerate mai jos (începând cu septembrie 2010):

  • Narayana
  • Atomikos TransactionsEssentials
  • Bitronix JTA

Elemente conexe

linkuri externe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT