Zdravim,
 
Vam vnorene transakce na J2EE _opravdu_ nekdy fungovaly???
 
Ziji v presvedceni, ze nested transakce J2EE nepodporuje, coz by nakonec
vysvetlovalo tu vyjimku "transaction already active, cannot nest". Rika se
tomu "flat transakce" - tj. vzdy existuje maximalne jedna transakce (v
nejakem stavu) a do ni nelze dalsi transakce vnorovat.
 
Viz treba:
 
http://java.sun.com/blueprints/qanda/transaction_management/index.html#neste
d
 
Honza

-----Původní zpráva-----
Od: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] za
uživatele Richard Holly
Odesláno: Thursday, November 15, 2007 14:42
Komu: Java
Předmět: Re: EJB3 a transakce v transakci



  @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

  @TransactionTimeout(18000)

  public void doSync() {

       try {

              // ... Provadej samotny prenos

             if(chybanekonzistence) {

       throw new RuntimeException()

}

} finally

       // uloz reporty     

       doUlozReporty( reportslist);     


    }

  } 




  @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

  public void doUlozReporty( ... reportslist) {


       ulozReporty(reportslist);

  } 










Adámek Lukáš  wrote / napísal(a): 

Hmm, asi jsem to nepopsal dostatecne.

Metoda doSync() ma uz nastaveno REQUIRES_NEW z duvodu zvetseni delky
transakce (stand. 

Mame nastavenu delku transakce na 2 minuty, coz staci pro celou aplikaci, a
jen pro tuto metodu 

mame nastaveno na 5 hodin).



Ale v ramci metody doSync() potrebujeme cast jejiho kodu obalit novou
transakci.



Zjednodusene: 



  @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

  @TransactionTimeout(18000)

  public void doSync() {

       try {

              // ... Provadej samotny prenos

             if(chybanekonzistence) {

       throw new RuntimeException()

}

} finally

       // uloz reporty     

       InitialContext ctx = new InitialContext();

       UserTransaction ut =
(UserTransaction)ctx.lookup("java:comp/UserTransaction");

       ut.begin();

       ulozReporty(reportslist);

       ut.commit();



       // v pripade ze nastala nekonzistence 

    }

  } 



Jelikoz mi runtimeExceptin vyleti ze servisni vrstvy, automaticky dochazi k
rollbacku, ale pritom se zapsali JEN reporty



l.




  _____  


From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
Behalf Of Richard Holly
Sent: Thursday, November 15, 2007 2:19 PM
To: Java
Subject: Re: EJB3 a transakce v transakci



Nastavte metode REQUIRES_NEW.  

Adámek Lukáš  wrote / napísal(a): 

Ahoj



Mame JEE aplikaci, ktera bezi na JBoss 4.0.4.

Pouzivame EJB3. Kazda metoda EJBeany bezi jako transakce.



Pro synchronizaci dat s produktem 3. strany mame napsanu metodu Beany
pojmenovanou doSync().

Metoda doSync() je volana Timerem v nastavenem intervalu.



Metoda doSync() zajistuje 

prenos samotnyh dat

ulozeni vyslednych reportu prenosu do db



Narazili jsme na problem.

Pokud totiz v metode nastane vyjimka, ktera zapricini nemoznost dalsiho
ukladani z duvodu nekonzistence 

dat v aplikaci 3 strany volame rollback transakce. Tim padem se nam ale
nezapisou ani reporty.

Chteli jsme to vyresit tak, ze v metode doSync(), ktera je obalena
transakci, vytvorime novou sourozeneckou 

transakci, ktera bude mit za ukol zapsat a comitnout reporty z prenosu.



Ulozeni v nove transakci jsme si predstavovali nejak takto:



InitialContext ctx = new InitialContext();

UserTransaction ut =
(UserTransaction)ctx.lookup("java:comp/UserTransaction");

ut.begin();

ulozReporty(reportslist);

ut.commit();



Problem je ze vysledkem je:



Transaction already active, cannot nest transactions.



Jak se podobne problemy resi v EJB3, kdyz neni mozne jakkoliv z transakce 

vytvorit novou transakci (at uz potomka, nebo sourozence)





Diky



Lukas Adamek








Odpovedet emailem