EJB 3.0-Transacción anidada!= Requiere Nuevo?


Acabo de leer el Capítulo Transacciones (10) de "Mastering EJB 3.0" y ahora estoy confundido acerca de las transacciones anidadas.

El libro dice

" El gestor de transacciones definido por EJB no admite transacciones anidadas; requiere soporte solo para transacciones planas."(Sitio 278, Nota)

Este hecho se describe no solo en este libro, encontré esta declaración en otros libros / sitios web.

Pero si llamo a un método anotado "Requiere Nuevo" desde a, vamos a digamos" Required " annotated Methode, lo que tengo es una transacción anidada, ¿no? Puedo revertir la transacción interna o confirmarla, sin afectar la transacción externa. Y si quiero que la Transacción externa sea abortada, devuelvo una EJBException y toda la transacción será revertida.

Entonces, ¿es que este comportamiento no es requerido por la especificación EJB 3.0 o he malinterpretado algo? Simplemente no puedo entender la diferencia entre las transacciones anidadas y el comportamiento descrito.

Saludos Norman

Author: NorRen, 2012-05-30

2 answers

RequiresNew no crea una transacción anidada porque la primera transacción se suspende mientras se ejecuta la segunda transacción. Una transacción anidada se ve así:

Nested transaction example
> method1 - begin tran1
  > method2 - begin tran2
    workA
  < method2 - commit tran2
< method1 - rollback tran1 (tran2 also rolled back because it's nested)

En su lugar, RequiresNew se ve así:

EJB RequiresNew example
> method1 - begin tran1
  > method2 - suspend tran1, begin tran2
    workA
  < method2 - commit tran2, resume tran1
< method1 - rollback tran1 (tran2 remains committed)
 40
Author: Brett Kail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-30 17:18:54

La respuesta simple es que la transacción "externa" se suspende antes de que se inicie la nueva transacción. Los destinos de las dos transacciones no están vinculados de ninguna manera, por lo que a todos los efectos uno no está anidado en otro.

Si el método REQUIRES_NEW lanza un EJBException es la nueva transacción que creó la que se revertirá, no la transacción "externa".

 8
Author: David Blevins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-30 17:19:17