méthode Spring @Transactional - transaction participation
-
30-09-2019 - |
Question
dans un dao j'ai 2 méthodes @Transactional.
si je ne fournis pas de propriétés explicites,
alors ce qui se passera, si
Je dirige une méthode dans le corps d'une autre?
Les deux méthodes se déroulera au sein de l'UN MÊME TRANSACTION?
La solution
Procurations au printemps AOP
Lors de l'utilisation Transactionnelle, vous traitez avec des mandataires des classes, donc dans ce scénario:
@Transactional
public void doSomeThing(){ // calling this method targets a proxy
doSomeThingElse(); // this method targets the actual class, not the PROXY,
// so the transactional annotation has no effect
}
@Transactional
public void doSomeThingElse(){
}
vous appelez le proxy de l'extérieur, mais le second appel de méthode est faite à l'intérieur de l'objet et celui-ci a mandaté aucun support transactionnel. Alors, naturellement, ils courent dans la même transaction, peu importe ce que les valeurs de l'annotation @Transactional dans la deuxième méthode sont
donc si vous avez besoin d'opérations distinctes, vous devez appeler
yourservice.doSomething();
yourservice.doSomethingElse();
de l'extérieur.
L'ensemble du scénario est assez bien expliqué dans le chapitre Spring AOP> AOP proxies comprendre , y compris cette "solution":
Accès à l'objet Proxy AOP actuel de l'intérieur
public class SimplePojo implements Pojo {
public void foo() {
// this works, but... gah!
((Pojo) AopContext.currentProxy()).bar();
}
public void bar() {
// some logic...
}
}
Autres conseils
La valeur par défaut de l'attribut propagation
de @Transactional
REQUIRED
, ce qui signifie:
Soutenir une transaction en cours, créer un nouveau si aucun existe.
Alors oui -. Les deux méthodes se déroulera dans la même transaction
Mais l'un des conseils importants: ne font pas votre OAC transactionnel . Les services devraient être transactionnels, pas le DAO.
d'une note:
En mode proxy (qui est la valeur par défaut), seuls les appels méthode externe à venir en par le proxy sont interceptés. Cela signifie que l'auto-invocation, en effet, un procédé au sein de la cible objet appelant une autre méthode de la objet cible, ne conduira pas à une transaction réelle lors de l'exécution même si la méthode appelée est marqué avec @Transactional.