java - transaction - Modo de transacción EJB predeterminado para métodos asíncronos?
rollback jta (2)
Cuando tengo un método
@Asynchronous
en un EJB, y no especifico el@TransactionAttribute
, ¿cómo exactamente maneja el contenedor los límites de la transacción? Obviamente, no puede usar la transacción del hilo llamante, entonces, ¿qué hace?La misma pregunta, pero con respecto a los métodos que se desencadenan por el TimerService.
EDIT: Creo que lo expresé mal. Ya sé que el modo predeterminado es ''REQUERIDO''. Por lo tanto, debe ser seguro suponer que esos métodos siempre serán llamados dentro de una transacción. Pero mi pregunta es, ¿cómo se ve el ciclo de vida de esa transacción? ¿El contenedor crea una nueva transacción para cada llamada? ¿O reutiliza la misma transacción para todas las llamadas en un hilo de trabajo asincrónico? Si es el último, ¿cuándo se cierra la transacción?
De EJB 3.1 spec.
4.5.3 Transacciones
El contexto de transacción del cliente no se propaga con una invocación de método asincrónico. Desde la perspectiva del Desarrollador de Frijol, nunca hay un contexto de transacción que fluya desde el cliente. Esto significa, por ejemplo, que la semántica del atributo de transacción OBLIGATORIO en un método asíncrono es exactamente igual a REQUIRES_NEW.
De forma similar a un MDB, el contenedor inicia la transacción justo antes de que su @Asynchronous
, @Schedule
o @Timeout
(y los interceptores aplicables) se invoque realmente y se @Timeout
justo después de que el método (y los interceptores) finalicen.
Como de costumbre, la transacción se propaga a todos los beans llamados en dicho método y todos los beans a los que llaman los beans, recursivamente. Por supuesto, otros beans invocados son bienvenidos para cambiar la semántica de transacción de su llamada a método a través de la especificación de otras configuraciones @TransactionAttribute
(digamos NOT_SUPPORTED
, o NOT_SUPPORTED
).
Nota al @TransactionManagement(BEAN)
, las transacciones nunca se propagan a los beans con @TransactionManagement(BEAN)
. El contenedor siempre suspenderá cualquier transacción en progreso antes de invocar un método en un bean Transaction administrado por Bean.