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 subyacente
noRollbackFor
y noRollbackForClassName
: la lista de Exception
clases Java que se pueden activar sin activar una reversión de transacción
rollbackFor
y rollbackForClassName
: la lista de Exception
clases Java que desencadenan una reversión de transacción cuando se lanza
propagation
: el tipo de propagación de transacción dado por Propagation
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
o transactionManager
: el nombre del TransactionManager
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 de Exception
clases Java que se pueden activar sin activar una reversión de transacción
rollbackOn
: la lista de Exception
clases Java que desencadenan una reversión de transacción cuando se lanza
value
: la estrategia de propagación, dada por la TxType
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`.
Para obtener más detalles sobre cómo la configuración del nivel de aislamiento es diferente cuando se utilizan las @Transactional
definiciones Spring o Java EE , consulte este artículo .
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.