SCBCD Dominical: Transaction Attributes

(Imagen: Henri Matisse - Marinero Joven)

Given the following stateful session bean

@Stateful
public class VideoBean implements Video{
public void methodA(){}

@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public void methodB(){}

public void methodC(){}

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void methodD(){}

}

Assuming no other transaction-related metadata, which is true?

  • methodB and methodC have transaction attribute SUPPORTS while methodD has transaction attribute REQUIRED
  • methodA and methodC have transaction attribute REQUIRES_NEW, while methodB has transaction attribute SUPPORTS
  • methodC, methodD and methodA have transaction attribute REQUIRED, and methodB has transaction attribute SUPPORTS
  • methodB has transaction attribute SUPPORTS , methodD has transaction attribute REQUIRED, and methodA and methodC have transaction attribute REQUIRES_NEW


Al utilizar un servidor EJB, no es necesario el control explícito de transacciones. Los servidores EJB manejan las transacciones implícitamente, basados en los atributos de transacción establecidos en tiempo de despliegue. Para esto utilizamos la anotación @javax.ejb.TransactionAttribute.

Se puede configurar un atributo de transacción para todo el EJB (o sea, para todos sus métodos) o se puede  colocar atributos de transacción diferentes para cada método individualmente. 

Ahora, si no se define @transactionAttribute ni se utiliza el descriptor de despliegue, el atributo de transacción por defecto es REQUIRED; por lo que methodA y methodC en nuestra pregunta tendrán dicho atributo de transacción.methodB tiene asignado SUPPORTS usando la anotación, y methodD es REQUIRED por el mismo medio, por lo que nuestra respuesta sería la tercera.

Ahora, sólo para recordar, el atributo REQUIRED establece que si el cliente que lo invoca es parte de una transacción, el EJB se incluye en el alcance de dicha transacción. Caso contrario, el EJB inicia su propia transacción (por eso el REQUIRED). Para el caso de SUPPORTS, si el cliente es parte de una transacción el EJB se unirá a dicha transacción (como REQUIRED), pero si no es así el EJB continuará su ejecución sin un contexto transaccional.Y para terminar, REQUIRES_NEW significa que siempre se inicia una nueva transacción, sin importar que el cliente ya sea parte de una transacción



Pregunta tomada de ExamWorx

Publicar un comentario