type tutorial transactionmanagement transactionattributetype transactionattribute transaction example java-ee transactions ejb-3.0 nested-transactions

java-ee - tutorial - ejb transaction type



EJB 3.0-Transacción anidada!=Requiere nuevo? (2)

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 EJBException arroja una EJBException es la nueva transacción que creó que se revertirá, no la transacción "externa".

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

El libro dice

"El administrador de transacciones definido por EJB no admite transacciones anidadas, sino que solo admite transacciones planas". (Sitio 278, Nota)

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

Pero si llamo a un método anotado "Requiere nuevo" de una, digamos "requerido" Metodología anotada, lo que tengo es una transacción anidada, ¿no es así? Puedo retrotraer la transacción interna o comprometerla, sin afectar la transacción externa. Y si quiero que se anule la Transacción externa, arrojo una EJBException de regreso y toda la transacción se revertirá.

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

Saludos Norman


RequiresNew no crea una transacción anidada porque la primera transacción se suspende mientras se está ejecutando 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 cambio, 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)