Maison >Java >javaDidacticiel >Pourquoi @Transactional ne fonctionne-t-il pas lors de l'appel d'une méthode dans la même classe au printemps ?

Pourquoi @Transactional ne fonctionne-t-il pas lors de l'appel d'une méthode dans la même classe au printemps ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-19 07:51:08322parcourir

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

Appel de méthode Spring @Transaction dans la même classe : comportement inattendu

Au Spring, des annotations comme @Transaction permettent aux développeurs de gérer les transactions sans effort. Cependant, un problème particulier survient lorsque l'on tente d'appeler une méthode transactionnelle (@Transactional) à partir de la même classe dans laquelle elle est définie.

Plus précisément, un développeur peut rencontrer une situation dans laquelle une méthode appelante au sein de la même classe qui contient une méthode @Transactional ne parvient pas à déclencher le comportement transactionnel attendu. Pour résoudre ce problème, examinons la raison sous-jacente.

CGLIB et AspectJ

Le mécanisme de gestion des transactions par défaut de Spring utilise CGLIB pour générer et améliorer dynamiquement des classes Java afin de créer des proxys pour Spring Beans. CGLIB, cependant, est confronté à des limitations lors de la gestion des invocations de méthodes au sein d'une même classe. Par conséquent, lorsque vous invoquez une méthode @Transactional depuis la même classe, CGLIB ne parvient pas à intercepter la transaction, entraînant l'absence de comportement transactionnel.

Programmation orientée aspect (AOP)

La solution à ce problème réside dans l'utilisation de la programmation orientée aspect (AOP) pour gérer les transactions. AOP nous permet d'intercepter et de modifier le comportement du programme sans modifier le code source lui-même.

Configuration pour AspectJ

Pour configurer Spring pour utiliser AspectJ pour la gestion des transactions, vous devez ajouter la configuration suivante :

<tx:annotation-driven mode="aspectj"/>

Si vous utilisez des versions Spring inférieures à 3.0, vous devez également ajouter :

<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf">
    <property name="transactionManager" ref="transactionManager"/>
</bean>

Refactoring Code

Une autre solution viable, surtout si l'AOP n'est pas réalisable, consiste à refactoriser votre code. Au lieu d'appeler la méthode transactionnelle à partir de la même classe, créez une classe distincte qui délègue la gestion des transactions à la méthode transactionnelle. Cette approche garantit que le mécanisme de gestion des transactions par défaut de Spring fonctionne correctement.

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!

Déclaration:
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