Pokud to ten Tx manazer da, pak to lze udelat i programove pres UserTransaction, jenom je potreba ji nastavit REQUIRES_NEW propagaci.
On Nov 15, 2007 6:24 PM, <[EMAIL PROTECTED]> wrote: > Dobry den, > > v principu je tento navrh dobre, jen je potreba volat metodu > ulozReporty() pres EJB objekt, protoze v EJB objektu container > zahajuje transakce. Tj. misto ulozReporty() napr.: > > sessionContext.getBusinessObject(MyLocalIntf.class).ulozReporty(reportsList); > > Transakcni atributy se pri primem volani (tj. v ramci beany) neuplatni. > > Jo a nepujde o vnorene transakce, ale aktivni transakce bude > pozastavena a vytvori se nova (flat model, jak tu uz nekdo zminil). > > Z.T. > -- > Zdenek Tronicek > Department of Computer Science and Engineering > Prague tel: +420 2 2435 7410 > http://cs.felk.cvut.cz/~tronicek > > > > Quoting Richard Holly <[EMAIL PROTECTED]>: > > > @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 > >> > >> > > > > > -- S pozdravem Roman "Dagi" Pichlik /* http://www.sweb.cz/pichlik/ Blog pro kodery */
