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
