Sobes.tech
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 :

  1. 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.
  2. Exécution de la méthode : La logique de la méthode elle-même est exécutée.
  3. 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).

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 pour RuntimeException.
  • 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.