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"/>
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... } }
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!