2011-12-13 12 views
13

Cuando un método (transaccional) de un EJB llama a otro método (transaccional) de otro EJB, y se lanza una excepción en el segundo, pero atrapado en el primero, parece que la transacción se realiza automáticamente retrocedió cuando el segundo regresa, incluso si el primero lo atrapa, ¿es cierto? ¿Cómo puedo evitarlo?EJB: Evitar retrotracción de transacción

El escenario es el siguiente:

@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() } 
} 

Respuesta

19

transacción se deshace en caso de que lanzar una excepción o cualquier RuntimeException que tienen @ApplicationException anotación con rollback atributo establece en true, por lo que:

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

RETROCEDERÁ la transacción actual.

De manera predeterminada, ApplicationException no retrotrae su transacción.

Si no desea que methodB repliegue su transacción, puede cambiar el comportamiento de reversión de su ApplicationException o evitar el intercambio de transacciones.

Esto último se puede lograr cambiando el TransactionAttribute del método B, es decir, al RequiresNew. Entonces, la transacción methodA (Tx1) será suspendida y, en caso de que el método B arroje una excepción que produzca una reversión de su transacción (Tx2), aún puede atraparla en el método A y evitar la reversión de su transacción methodA (Tx1).

8

Sí, es verdad, si la excepción es una excepción de tiempo de ejecución. Las excepciones controladas no causan una reversión de transacción.

Para evitarlo, solo asegúrese de que el código en methodB no arroja ninguna excepción de tiempo de ejecución. Una excepción de tiempo de ejecución normalmente indica un error o un estado que no permite continuar el trabajo.

+0

Lo siento, lo siento, modifiqué la pregunta para señalar que está lanzando una excepción marcada, ¿la transacción se retrotrae también en este escenario? – edutesoy

+1

No, no se debe revertir si la excepción es una excepción marcada. –

+1

Si todo lo que sabe es que la Excepción está marcada, no puede decir si revertirá o no su transacción. Si se trata de '@ApplicationException (rollback = true)', podría deshacer su transacción. –

Cuestiones relacionadas