2011-12-13 14 views
13

Quando un metodo (transazionale) di un EJB chiama un altro metodo (transazionale) di un altro EJB e un'eccezione viene lanciata nel secondo, ma viene rilevata nella prima, sembra che la transazione sia automaticamente tirato indietro quando ritorna il secondo, anche se il primo lo prende, è vero? come posso evitarlo?EJB: Evita il rollback delle transazioni

Lo scenario è la seguente:

@Stateless 
class ClassA { 
    @EJB 
    ClassB objectB; 

    methodA() { 
     try { 
      objectB.methodB(); 
     } 
     catch(Exception e) { 
      //Here the transaction started in this method is 
      //automatically rolled back. Is this avoidable? 
     } 
    } 
} 

@Stateless 
class ClassB { 
    methodB() throws Exception { throw new Exception() } 
} 

risposta

19

transazione viene annullata nel caso in cui si getta un o qualsiasi eccezione RuntimeException che hanno @ApplicationException annotazione con l'attributo rollback impostato true, quindi:

@ApplicationException(rollback=true) 
public class MyException extends Exception { 
    // ... 
} 

sarà rollback della transazione corrente.

Per impostazione predefinita ApplicationException non rollback la transazione.

Se non si desidera che il metodoB esegua il rollback della transazione, è possibile modificare il comportamento di rollback dello ApplicationException o impedire la condivisione delle transazioni.

Quest'ultimo è ottenibile modificando TransactionAttribute di methodB, vale a dire RequiresNew. Quindi la transazione methodA (Tx1) sarà sospesa e nel caso in cui metodoB generi un'eccezione che si traduce in rollback della sua transazione (Tx2), è ancora possibile prenderla nel metodoA e impedire il rollback della transazione methodA (Tx1).

8

Sì, è vero, se l'eccezione è un'eccezione di runtime. Le eccezioni controllate non causano il rollback della transazione.

di evitarlo, basta assicurarsi che il codice in methodB non genera alcuna eccezione di runtime. Un'eccezione di runtime indica normalmente un bug o uno stato che non consente di continuare il lavoro.

+0

Il mio male, mi dispiace, ho modificato la questione notare che sta gettando un eccezione controllata, è la transazione rollback anche in questo scenario? – edutesoy

+1

No, non dovrebbe essere ripristinato se l'eccezione è un'eccezione controllata. –

+1

Se tutto ciò che sai è che l'Eccezione è selezionata, non puoi dire se ripristinerà o meno la tua transazione. Se è '@ApplicationException (rollback = true)' potrebbe eseguire il rollback della transazione. –

Problemi correlati