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