Nene, jede to nad Oracle 10g XE

 

l.

 

________________________________

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

 

Nepouzivate nahodou mysql - myisam ?

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

Tak tahle varianta nefunguje.

 

Vypadato, jakoby transakce metody doSync() byla nadrazena a rollbackne i tu, 
kterou v sobe vytvari.

 

l.

 

________________________________

From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Richard Holly
Sent: Thursday, November 15, 2007 2:42 PM
To: Java
Subject: 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