Annotations transactionnelles: Spring vs JTA

Haut de persistance

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS

1. Vue d'ensemble

Dans ce didacticiel, nous discuterons des différences entre les annotations org.springframework.transaction.annotation.Transactional et javax.transaction.Transactional .

Nous commencerons par un aperçu de leurs propriétés de configuration. Ensuite, nous discuterons des types de composants auxquels chacun peut être appliqué et dans quelles circonstances nous pouvons utiliser l'un ou l'autre.

2. Différences de configuration

L' annotation transactionnelle de Spring est fournie avec une configuration supplémentaire par rapport à son homologue JTA:

  • Isolation - Spring offre une isolation à l'échelle des transactions via la propriété isolation ; cependant, dans JTA, cette fonctionnalité n'est disponible qu'au niveau de la connexion
  • Propagation - disponible dans les deux bibliothèques, via la propriété de propagation dans Spring et la propriété value dans Java EE; Spring propose Nested comme type de propagation supplémentaire
  • Lecture seule - disponible uniquement dans Spring via la propriété readOnly
  • Timeout - disponible uniquement au printemps via la propriété timeout
  • Rollback - les deux annotations offrent une gestion des rollbacks; JTA fournit les propriétés rollbackOn et dontRollbackOn , tandis que Spring a rollbackFor et noRollbackFor , ainsi que deux propriétés supplémentaires: rollbackForClassName et noRollbackForClassName

2.1. Configuration d'annotation transactionnelle Spring

À titre d'exemple, utilisons et configurons l' annotation Spring Transactional sur un simple service de voiture:

import org.springframework.transaction.annotation.Transactional; @Service @Transactional( isolation = Isolation.READ_COMMITTED, propagation = Propagation.SUPPORTS, readOnly = false, timeout = 30) public class CarService { @Autowired private CarRepository carRepository; @Transactional( rollbackFor = IllegalArgumentException.class, noRollbackFor = EntityExistsException.class, rollbackForClassName = "IllegalArgumentException", noRollbackForClassName = "EntityExistsException") public Car save(Car car) { return carRepository.save(car); } }

2.3. Configuration d'annotation transactionnelle JTA

Faisons de même pour un simple service de location utilisant l' annotation JTA Transactional :

import javax.transaction.Transactional; @Service @Transactional(Transactional.TxType.SUPPORTS) public class RentalService { @Autowired private CarRepository carRepository; @Transactional( rollbackOn = IllegalArgumentException.class, dontRollbackOn = EntityExistsException.class) public Car rent(Car car) { return carRepository.save(car); } }

3. Applicabilité et interchangeabilité

L' annotation transactionnelle JTA s'applique aux beans gérés par CDI et aux classes définies comme des beans gérés par la spécification Java EE, tandis que l' annotation transactionnelle de Spring s'applique uniquement aux beans Spring.

Il convient également de noter que la prise en charge de JTA 1.2 a été introduite dans Spring Framework 4.0. Ainsi, nous pouvons utiliser l' annotation transactionnelle JTA dans les applications Spring . Cependant, l'inverse n'est pas possible car nous ne pouvons pas utiliser les annotations Spring en dehors du contexte Spring.

4. Conclusion

Dans ce tutoriel, nous avons discuté des différences entre les annotations transactionnelles de Spring et JTA, et du moment où nous pouvons utiliser l'une ou l'autre.

Comme toujours, le code de ce didacticiel est disponible à l'adresse over sur GitHub.

Fond de persistance

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS