[Javalist] TransactionAttributeType.REQUIRES_NEW

Zoltán Bernát bernatzoltan at gmail.com
2013. Feb. 3., V, 15:17:45 CET


Sziasztok!

JPA kerdes. Tranzakcio kezeles. A megoldando feladat az lenne, hogy
tobb entitast toroljek a DB-bol, de olyan modon, hogy ha valamelyik
torles meghiusul (pl foreign key miatt), attol meg a tobbi torles
rendben megtortenjen.
(azaz egy sikertelen torles ne rollback-elje az egesz procedurat)

Ugy gondoltam volna megoldani a dolgot, hogy egy tranzakcioban futo
metodusbol ciklusban torlom a kepeket egy masik,
TransactionAttributeType.REQUIRES_NEW tranzakcioban.

A hibajelenseg az, hogy  ha egy torles nem sikerult a deletePic (Pix
picEntity) metodusban(pl ConstraintViolationException miatt. (ami
rendben is van)), akkor a metodus kovetkezo hivasanal mar
TransactionRequiredException kivetel dobodik szinten a  deletePic (Pix
picEntity) metodusban, es igy az amugy torolheto entitast sem sikerul
torolni. Azaz ha csak egy entitas is van, amelyik nem torolheto, az
osszes torlese meghiusul.

Azt gondolom, elvi hibas a megoldasom, meg azt, hogy a
TransactionAttributeType.REQUIRES_NEW pont ilyen esetekre lett
kitalalva. Hol benazom el? (Hol ertem felre a
TransactionAttributeType.REQUIRES_NEW szerepet)?
Koszi!

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public List<Integer> deletePix(List<Integer> ids){
    for(Integer id : ids){
        ...
                    if(deletePic(pixBeanEntity)){
                        ... //sikeres torles
                    }
    }
}


@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    private boolean deletePic (Pix picEntity){
        try {
            em.remove(picEntity); //em az EntitiManager
            //org.hibernate.exception.ConstraintViolationException, ha
nem megy a torles a foreign key miatt. Ez az elvart viselkedes.
            //De: TransactionRequiredException jon akkor is, ha
            em.flush(); //entitiManager flush
            // itt tovabbi utasitasok vannak, amikre nem kerul a
vezerles, ha a fenti flush() kivetelt dobott
        } catch (Exception e) {
            context.setRollbackOnly();
            return false;
        }
        return true;
    }


További információk a(z) Javalist levelezőlistáról