Middle
Que signifie l'annotation @Transactional dans Spring Data?
sobes.tech IA
Réponse de l'IA
L'annotation @Transactional dans Spring Data indique qu'une méthode ou une classe doit s'exécuter dans le cadre d'une transaction. Spring AOP (Programmation Orientée Aspects) crée un objet proxy autour de cette méthode, qui gère le cycle de vie de la transaction.
Les actions principales effectuées par @Transactional :
- Début de la transaction : Avant l'exécution de la méthode annotée, une nouvelle transaction est ouverte ou une transaction existante est utilisée.
- Exécution de la méthode : La logique de la méthode elle-même est exécutée.
- Validation ou rollback de la transaction :
- Si la méthode se termine avec succès sans exceptions (par défaut uniquement
RuntimeException), la transaction est validée (commit). - Si une exception est levée dans la méthode (par défaut
RuntimeException), la transaction est annulée (rollback).
- Si la méthode se termine avec succès sans exceptions (par défaut uniquement
Principaux attributs de l'annotation :
propagation: Détermine comment les transactions interagissent entre elles (par exemple,REQUIRED,REQUIRES_NEW,SUPPORTS). Par défaut,REQUIRED.isolation: Détermine le niveau d'isolation de la transaction pour éviter les problèmes d'accès concurrent aux données (par exemple,READ_COMMITTED,REPEATABLE_READ). Par défaut, le niveau d'isolation de la base de données est utilisé.readOnly: Indique que la transaction doit s'exécuter en mode lecture seule. Optimise la performance pour les lectures.timeout: Définit le temps maximum d'exécution de la transaction avant un rollback automatique.rollbackFor: Indique la liste des types d'exceptions qui, en cas de survenue, doivent entraîner un rollback de la transaction. Par défaut, rollback pourRuntimeException.noRollbackFor: Indique la liste des types d'exceptions qui, en cas de survenue, ne doivent pas entraîner un rollback.
Exemple d'utilisation :
// Exemple de couche de service
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Transactional // Cette méthode sera exécutée dans une transaction
public User createUser(User user) {
// Logique de création d'utilisateur, pouvant inclure plusieurs opérations avec la BD
userRepository.save(user);
// Peut-être une autre opération de sauvegarde ou de mise à jour
// userRepository.updateRelatedInfo(user.getId(), ...);
return user;
}
@Transactional(readOnly = true) // Méthode en lecture seule, optimisation
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
@Transactional(rollbackFor = CustomBusinessException.class) // Rollback en cas d'exception personnalisée
public void performCriticalOperation(Long userId) throws CustomBusinessException {
// Logique d'opération critique
// Peut lancer CustomBusinessException
}
}
L'annotation @EnableTransactionManagement est généralement utilisée dans une classe de configuration pour activer la gestion déclarative des transactions.