Ahoj,
zkusím odpovědět na Tvoje otázky.
1. Při atributu REQUIRED bude použita již existující transakce, tedy ta,
kterou jsi nastartoval ručně.
2. J2EE opravdu nepodporuje nested transakce, můžeš si ovšem vypomoci
attributem REQUIRES_NEW, pokud potřebuješ něco udělat v samostatné
transakci bez ovlivnění aktuální transakce. Pří vyžádání UserTransaction
uvnitř container-managed transakční metody pravděpodobně dostaneš
existující nastartovanou transakci, jak předpokládáš. Myslím, že Ti
container nedovolí na ní zavolat ručně commit, ale pokud ano (zkoušel
jsi to?), transakce se ukončí a další práce pojede v nové transakci.
Rollback tedy určitě nebude moci odvolat práci z první, již ukončené
transakce. Přiznám se, že takto kombinovat container-managed a
bean-managed transakce jsem nikdy nezkoušel a myslím, že takové řešení
je dost nepřehledné. Container Ti to pravděpodobně vůbec nedovolí.
Transakce bys měl začínat i končit ve stejné metodě, container-managed
transakce by se neměly ukončovat ručně, stačí nastavit rollbackOnly
flag, pokud chceš vynutit rollback, jinak bude transakce ukončena při
ukončení metody.
Samozřejmě neznám přesně strukturu Tvého projektu, proto si netroufám
soudit, zda směřuješ správným směrem. Můžeš případně trochu rozvést
"veskere zpracovani ve vsech listenerech probehne v jedne transakci"?
Vašek
Moravec Jan wrote:
Ahoj,
Rad bych se zeptal nejakeho J2EE znalce jak se chova UserTransaction v
prostredi, kde je pouzita fasada ze session beanu s container-managed
transakcemi (vse nastaveno na Required).
V podstate nastavaji tyto dva pripady:
1) UserTransaction vytvorim pred tim, nez se zavola metoda na session beanu
(tj. pred tim, ze container pripadne zalozi novou transakci)
2) UserTransaction vytvorim az nekde za session beanem.
Otazky:
ad 1) Pouzije session bean jiz existujici transakci (tj. moji UserTransaction),
nebo vytvori novou?
ad 2) Dostanu v podobe UserTransaction novou transakci, nebo dostanu jiz
existujici transakci? Nekde jsem zahledl neco o tom, ze J2EE nepodporuje
vnorovani transakci, takze predpokladam, ze dostanu jiz existujici transakci.
Nicmene, co kdyz na ni explicitne zavolam commit a pak nekde dale behem dalsiho
zpracovani vyhodim runtime vyjimku s tim, ze chci rollback cele transakce.
Provede se rollback i toho co jsem jiz comittoval v UserTransaction?
V podstate mi jde o implementaci udalostniho frameworku - aplikace v ruznych
mistech (treba i na JSP strankach, pripadne hloubeji za session facade)
generuje udalosti. Tyto se predavaji do registrovanych listeneru. Listener muze
provadet cokoli (typicky zapis do DB) a potrebuji zarucit, ze veskere
zpracovani ve vsech listenerech probehne v jedne transakci.
Diky moc za osvetleni.
Honza