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?

Était-ce utile?

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.

Spring doc

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top