Maison > Java > javaDidacticiel > Pourquoi mon annotation Spring @Transactional ne fonctionne-t-elle pas lors de l'appel d'une méthode à partir de la même classe ?

Pourquoi mon annotation Spring @Transactional ne fonctionne-t-elle pas lors de l'appel d'une méthode à partir de la même classe ?

Susan Sarandon
Libérer: 2024-12-27 10:25:24
original
841 Les gens l'ont consulté

Why Doesn't My Spring @Transactional Annotation Work When Calling a Method from Within the Same Class?

Spring Transaction : gestion des appels de méthode au sein de la même classe

Lors de l'annotation d'une méthode avec @Transactional pour gérer les transactions, un comportement inattendu peut survenir lors de l’appel de cette méthode depuis la même classe. La transaction peut ne pas être appliquée comme prévu.

Pour résoudre ce problème, il est essentiel de comprendre que Spring utilise l'AOP (Aspect-Oriented Programming) pour implémenter la gestion des transactions par défaut. Lors de l'utilisation de CGLIB pour AOP (qui est la valeur par défaut), il crée une instance proxy pour la classe annotée. Cela signifie que lorsqu'une méthode est appelée depuis la même classe, elle interagit avec l'instance proxy au lieu de la classe d'origine, ce qui entraîne la non-application de la transaction.

Solution : Activer AspectJ pour la gestion des transactions.

Pour surmonter cette limitation, vous pouvez activer AspectJ pour la gestion des transactions dans votre configuration Spring en ajoutant ce qui suit code :

<tx:annotation-driven mode="aspectj"/>
Copier après la connexion

En configurant AspectJ, Spring utilisera AspectJ pour gérer les transactions, ce qui résoudra le problème des appels de méthode au sein de la même classe.

Approche alternative : refactoriser le code

Si vous préférez ne pas utiliser AspectJ, une approche alternative consiste à refactoriser votre code et à séparer la gestion des transactions dans une classe différente ou un service. Ce faisant, la méthode transactionnelle annotée peut être appelée depuis la classe distincte et la transaction sera appliquée correctement.

Par exemple, considérons le code suivant :

public class UserService {

    private UserServiceHelper helper;

    public boolean addUser(String userName, String password) {
        return helper.addUser(userName, password);
    }
}

public class UserServiceHelper {

    @Transactional
    public boolean addUser(String userName, String password) {
        // Transactional logic...
    }
}
Copier après la connexion

Dans ce cas , la méthode transactionnelle addUser est définie dans une classe d'assistance et la classe UserService appelle cette méthode. La transaction sera appliquée correctement dans ce scénario.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal