No entiendo cuál es la diferencia real entre anotaciones javax.transaction.Transactional
y org.springframework.transaction.annotation.Transactional
?
¿Es org.springframework.transaction.annotation.Transactional
una extensión javax.transaction.Transactional
o tienen un significado totalmente diferente? ¿Cuándo deben usarse cada uno de ellos? ¿Primavera @Transactinal
en la capa de servicio y Java en DAO?
Gracias por responder.
javax.transaction.Transactional
que ahora se pueda usar también en aplicaciones Spring sin ninguna acción adicional. En mi opinión, esta fue una decisión bastante mala desde el punto de vista del diseño , porque, según mi experiencia, muchos desarrolladores confunden inconscientemente a estos dos en su código, lo que lleva a problemas posteriores.org.springframework.transaction.annotation.Transactional
ofrece más opciones (comoreadOnly
,timeout
) quejavax.transaction.Transactional
Otra diferencia es cómo Spring maneja las anotaciones @Transactional
javax.ejb.TransactionAttribute
está disponible en el classpath (de la versión 2.5.3 a 3.2.5). Por lo tanto, puede terminar sin tener en cuenta sus anotaciones si solojavax.transaction.Transactional
está en su classpath y nojavax.ejb.TransactionAttribute
. Este puede ser el caso si está trabajando con Hibernate: hibernate-core (4.3.7.Final) depende de jboss-transaction-api_1.2_spec (1.0.0.Final), que no proporcionajavax.ejb.TransactionAttribute
.fuente
Tenga cuidado, (este problema ocurrió en tomcat),
Si su aplicación es la aplicación web SPRING y está utilizando el mecanismo de manejo de transacciones de Spring
@org.springframework.transaction.annotation.Transactional
, entonces no lo mezcle con javax.transaction.Transactional.Eso es siempre uso,
@org.springframework.transaction.annotation.Transactional
en una aplicación de primavera consistentemente.De lo contrario, podemos terminar con este error,
fuente
Alcance de transacción declarativa
Tanto la
@Transaction
anotación Spring como la JPA le permiten definir el alcance de una transacción de aplicación determinada.Entonces, si un método de servicio se anota con la
@Transactional
anotación, se ejecutará en un contexto transaccional. Si el método de servicio utiliza múltiples DAO o repositorios, todas las operaciones de lectura y escritura se ejecutarán en la misma transacción de la base de datos.Primavera
@Transactional
La
org.springframework.transaction.annotation.Transactional
anotación ha estado disponible desde la versión 1.2 del marco Spring (circa 2005), y le permite establecer las siguientes propiedades transaccionales:isolation
: el nivel de aislamiento de la base de datos subyacentenoRollbackFor
ynoRollbackForClassName
: la lista deException
clases Java que se pueden activar sin activar una reversión de transacciónrollbackFor
yrollbackForClassName
: la lista deException
clases Java que desencadenan una reversión de transacción cuando se lanzapropagation
: el tipo de propagación de transacción dado porPropagation
Enum. Por ejemplo, si el contexto de la transacción se puede heredar (por ejemplo,REQUIRED
) o se debe crear un nuevo contexto de transacción (por ejemplo,REQUIRES_NEW
) o si se debe lanzar una excepción si no está presente el contexto de la transacción (por ejemplo,MANDATORY
) o si se debe lanzar una excepción si se encuentra un contexto de transacción actual (por ejemplo,NOT_SUPPORTED
).readOnly
: si la transacción actual solo debería leer datos sin aplicar ningún cambio.timeout
: cuántos segundos se debe permitir que se ejecute el contexto de la transacción hasta que se produzca una excepción de tiempo de espera.value
otransactionManager
: el nombre delTransactionManager
bean Spring que se utilizará al vincular el contexto de la transacción.Java EE
@Transactional
La
javax.transaction.Transactional
anotación fue agregada por la especificación Java EE 7 (circa 2013). Entonces, la anotación Java EE se agregó 8 años después que su contraparte de Spring.Java EE
@Transactional
define solo 3 atributos:dontRollbackOn
: la lista deException
clases Java que se pueden activar sin activar una reversión de transacciónrollbackOn
: la lista deException
clases Java que desencadenan una reversión de transacción cuando se lanzavalue
: la estrategia de propagación, dada por laTxType
Enum. Por ejemplo, si el contexto de la transacción se puede heredar (por ejemplo,REQUIRED
) o se debe crear un nuevo contexto de transacción (por ejemplo,REQUIRES_NEW
) o si se debe lanzar una excepción si no está presente el contexto de la transacción (por ejemplo,MANDATORY
) o si se debe lanzar una excepción si se encuentra un contexto de transacción actual (por ejemplo,NOT_SUPPORTED
).¿Cuál elegir?
Si está usando Spring o Spring Boot, use la
@Transactional
anotación Spring , ya que le permite configurar más atributos que la@Transactional
anotación Java EE .Si usa Java EE solo y despliega su aplicación en un servidor de aplicaciones Java EE, use la anotación Java EE `` @ Transactional`.
fuente