Quelle est la différence entre la définition des @Transactionnelle de la classe vs méthode
Décision1
@Transactional
public class UserServiceImpl implements UserService {
...................
public void method1(){
try{
method2();
}catch(Exception e){
}
}
public void method2(){
}
}
Case2
public class UserServiceImpl implements UserService {
...................
public void method1(){
try{
method2();
}catch(Exception e){
}
}
@Transactional
public void method2(){
}
}
Dans décision1 si une exception survient, la restauration est au travail, mais dans le cas 2, il ne fonctionne pas. Est-il des problèmes de performances si j'ai suivi la décision1?
Vous devez vous connecter pour publier un commentaire.
Dans le cas 1 @Transactionnelle est appliqué à chaque méthode individuelle.
Dans le cas 2 @Transactionnelle est uniquement appliqué à method2(), et non sur method1()
Cas 1:
- Invocation de method1() -> une transaction est démarrée. Lorsque method1() appelle method2() aucune nouvelle transaction est lancé, car il y a déjà un
Cas 2:
- Invocation de method1() -> pas de transaction est démarrée. Lorsque method1() appelle method2() PAS nouvelle transaction est démarrée. C'est parce que @Transactional ne fonctionne pas lors de l'appel d'une méthode à partir de l'intérieur de la même classe. Il pourrait fonctionner si vous appelez method2() à partir d'une autre classe.
De la manuel de référence-printemps:
@Transactional
sur une classe s'applique à chaque méthode sur le service. C'est un raccourci. En général, vous pouvez définir@Transactional(readOnly = true)
sur une classe de service, si vous savez que toutes les méthodes d'accéder au dépôt de la couche. Vous pouvez ensuite remplacer le comportement par@Transactional
sur les méthodes d'effectuer des changements dans votre modèle. Les problèmes de performances entre 1) et 2) ne sont pas connus.Supposons que vous avez la classe suivante:
La
@Transactional
annotation sur le niveau de la classe sera appliqué à chaque méthode dans la classe.Cependant, lorsqu'une méthode est annoté avec
@Transactional
(comme,updateFoo(Foo foo)
) doit l'emporter sur l'affichage et les paramètres définis au niveau de la classe.Plus d'infos:
Citant ici
Depuis ce mécanisme est basé sur les proxys, seuls les "externes" méthode des appels arrivant par la procuration seront interceptés. Cela signifie que 'auto-invocation", c'est à dire une méthode de l'objet cible de l'appel à une autre méthode de l'objet cible, ne vous conduira pas à une transaction au moment de l'exécution, même si la méthode invoquée est marqué avec @Transactional!
@Transactional
méthode annotée et@Transactional
annoté de la classe.