Otra pregunta SCBCD: Manejo de Transacciones

(Imagen: Salvador Dalí - Crucifixión)

Una más!

Given a set of CMT bean methods with the following transaction attributes:

Method M1 = SUPPORTS
Method M2 = REQUIRED
Method M3 = NOT_SUPPORTED
Method M4 = REQUIRES_NEW

And the following invocation sequence:

Method M1 invokes Method M2
Method M2 invokes Method M3
Method M1 invokes Method M4

If Method Mº1 is invoked by a method that does NOT have a transaction context, which describes a possible scenario?

  • Method M1: no transaction
    Method M2: new transaccion
    Method M3: no transaction
    Method M4: new transaction
  • Method M1: no transaction
    Method M2: Container throws EJBTransactionRequiredException
  • Method M1: new transaction
    Method M2: runs in the same transaction as M1
    Method M3: Container throws TransactionNotSupportedException
  • Method M1: no transaction
    Method M2: new transaction
    Method M3: Container throws TransactionNotSupportedException
Una vez, y como casi siempre, vamos por partes:

Se invoca M1 desde un método que no posee un contexto transaccional. Como el atributo de transacción de M1 es SUPPORTS, no se crea una nueva transacción. De haber existido un contexto transaccional, M1 se hubiera incluido en él, pero ese no es el caso. Entonces, para M1 no hay transacción.

M1, que no posee contexto transaccional, invoca a M2. El atributo de transacción de M2 es REQUIRED, lo que implica que M2 comenzará su propia nueva transacción (para que quede constancia, si M1 estaba en un contexto transaccional se hubiera unido a él). Segundo paso: M2 crea una nueva transacción.

M2 en su nueva transacción invoca a M3, cuyo atributo de transacción es NOT_SUPPORTED. Es debido a esto que la transacción M2 es suspendida hasta que el método M3 se complete, y cuando se complete se continuará con la transacción de M2. Pero en M3 no se ejecuta transacción alguna.

Y para terminar esto, M1 invoca a M4, cuyo a tributo de transacción es REQUIRES_NEW, por lo que una nueva transacción siempre es iniciada, sin importar que el cliente sea o no parte de una transacción. Entonces, M4 se ejecuta en una nueva transacción.

Por lo que queda demostrado que la respuesta correcta es la primera.

PS: Para los que se quedaron curiosos, la excepción javax.ejb.EJBTransactionRequiredException es lanzada cuando se invoca a un método con atributo de transacción MANDATORY desde un cliente que no es parte de una transacción;

Pregunta tomada de ExamWorx

Publicar un comentario