Alcance de transacción declarativa
Tanto la @Transactionanotació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 @Transactionalanotació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.Transactionalanotació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 subyacente
noRollbackFory noRollbackForClassName: la lista de Exceptionclases Java que se pueden activar sin activar una reversión de transacción
rollbackFory rollbackForClassName: la lista de Exceptionclases Java que desencadenan una reversión de transacción cuando se lanza
propagation: el tipo de propagación de transacción dado por PropagationEnum. 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.
valueo transactionManager: el nombre del TransactionManagerbean Spring que se utilizará al vincular el contexto de la transacción.
Java EE @Transactional
La javax.transaction.Transactionalanotació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 @Transactionaldefine solo 3 atributos:
dontRollbackOn: la lista de Exceptionclases Java que se pueden activar sin activar una reversión de transacción
rollbackOn: la lista de Exceptionclases Java que desencadenan una reversión de transacción cuando se lanza
value: la estrategia de propagación, dada por la TxTypeEnum. 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 @Transactionalanotación Spring , ya que le permite configurar más atributos que la @Transactionalanotació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`.
Para obtener más detalles sobre cómo la configuración del nivel de aislamiento es diferente cuando se utilizan las @Transactionaldefiniciones Spring o Java EE , consulte este artículo .
javax.transaction.Transactionalque 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.