Au Spring, les méthodes transactionnelles sont généralement annotées avec @Transaction. Lorsqu'une méthode transactionnelle est invoquée, Spring gère automatiquement le cycle de vie de la transaction, garantissant l'intégrité des données face aux exceptions. Cependant, un comportement inattendu se produit lorsqu’une méthode transactionnelle est appelée depuis la même classe. La transaction semble être contournée, laissant les développeurs perplexes.
Spring utilise des proxys dynamiques (tels que CGLIB) pour intercepter les appels de méthode et appliquer un comportement transactionnel. Cependant, lorsqu'une méthode transactionnelle appelle une autre méthode transactionnelle au sein de la même classe, le proxy dynamique est contourné. En effet, l'objet cible est le même dans les deux cas et le proxy n'est créé que pour les invocations de méthodes externes.
Pour résoudre ce problème, vous devez deux options :
Pour configurer AspectJ pour la gestion transactionnelle, suivez ces étapes :
Pour les versions Spring antérieures à 3.0, ajoutez également la définition de bean suivante à votre configuration :
<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf"> <property name="transactionManager" ref="transactionManager" /> </bean>
En adoptant AspectJ ou En refactorisant votre code, vous pouvez surmonter les limitations de la gestion transactionnelle par défaut de Spring et garantir un comportement de transaction cohérent, même pour les appels imbriqués au sein du même classe.
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!