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]> [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