@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