IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Spring AOP et isolation des transactions


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 169
    Par défaut Spring AOP et isolation des transactions
    Bonjour,

    Le titre n'est peut-être pas très clair, mais je vais tenter de l'expliquer ici.
    Dans notre projet, nous avons configurer les transactions grâce à l'AOP.
    Nous avons donc dans notre configuration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <tx:advice id="daoTxAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="retrieve*" propagation="REQUIRED" read-only="true" />
    	<tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <aop:config proxy-target-class="true">
        <aop:advisor advice-ref="daoTxAdvice" pointcut="nos_points_coupes" />
    </aop:config>
    Tout fonctionne parfaitement jusque là.
    Pour rajouter un peu de complexité nous avons besoin pour un traitement particulier de faire n opérations et un commit à la fin.

    Question comment gèrer ce cas ?
    D'avance merci de vos lumières.

    HadanMarv

  2. #2
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 136
    Par défaut
    Met une transaction sur ton(tes) service(s).

    Dans ton service tu fait tes n opérations et le commit sera fait tranquillement a la fin de la méthode ( et rollback en cas d'exception).

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Octobre 2009
    Messages : 169
    Par défaut
    Et de fait comment faire pour gérer soit même la transaction ?

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 136
    Par défaut
    Citation Envoyé par HadanMarv Voir le message
    Et de fait comment faire pour gérer soit même la transaction ?
    Tu n'as pas besoin de le faire toi même, Spring le fait pour toi.

    En plus de test transaction sur tes DAO, tu met transaction sur ton service.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <tx:advice id="serviceTxAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="retrieve*" propagation="REQUIRED" read-only="true" />
    	<tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>
     
    <aop:config proxy-target-class="true">
         <aop:pointcut id="serviceMethods"
    			expression="execution(* monpackage..*.Monservice.mamethode(..))" />
     
     
        <aop:advisor advice-ref="serviceTxAdvice" pointcut="serviceMethods" />
    </aop:config>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public class Monservice implements IMonService{
     
      Idao1 dao1;
      Idao2 dao2;
     
    @Autowired
    public Monservice (Idao1 dao1, Idao2 dao2) {
     this.dao1 = dao1;
    this.dao2 = dao2;
    }
     
    /**
     Ma methode qui sera transactionnelle vue qu'il y a le pointcut dessus.
     A NE SURTOUT PAS APPELER AVEC UN this.mamethode(); SINON ON PASSE PAS PAR COUCHE SPRING!
    **/
    public void maMethodeduService() {
     
      dao1.methode1();
      dao2.methode1();
      dao1.methode2();
     
    }
     
    }
    quand tu va appeler ta methode maMethodeduService() voila comment ça se passe niveau transaction/ pile des appelle :


    appel proxy spring de Monservice.maMethodeduService
    debut transaction #1
    appel reel implementation maMethodeduService

    apel proxy dao1.mamethode1
    debut transaction #2
    appelle reel implementation dao1.mamethode1
    fin reel implementation dao1.mamethode1
    fin transaction #2

    apel proxy dao2.mamethode1
    debut transaction #3
    appelle reel implementation dao2.mamethode1
    fin reel implementation dao2.mamethode1
    fin transaction #3


    appel proxy dao1.mamethode2
    debut transaction #4
    appelle reel implementation dao1.mamethode2
    fin reel implementation dao1.mamethode2
    fin transaction #4

    fin reel implementation maMethodeduService
    fin transaction #1


    ta méthode sera entouré d'une transaction et donc avec un commit a la fin.
    Si dao2.methode1() pète en l'air pour une raison x ou y, il n'y aura pas de probleme sur la base car c'est toujours dans la transaction #1, donc il y aura un rollback.

    Après si vraiment tu veux le gérer en code. tu peut regarder l'interface ResourceTransactionManager ou PlatformTransactionManager.
    Tu peut l'autowired vue qu'il existe un bean de transaction manager qui l’implémente ( celui d'hibernate en tous cas le fait ).

Discussions similaires

  1. Isolation des transactions avec Hibernate
    Par Gob4 dans le forum Hibernate
    Réponses: 0
    Dernier message: 14/03/2013, 11h48
  2. [EF] Niveau d'isolation des transactions
    Par stephane.julien dans le forum Accès aux données
    Réponses: 2
    Dernier message: 25/03/2009, 10h49
  3. Réponses: 2
    Dernier message: 09/01/2008, 11h18
  4. [TOUS] Isolation des transactions : Optimisation
    Par dymezac dans le forum MS SQL Server
    Réponses: 17
    Dernier message: 03/09/2007, 18h03
  5. Niveau isolement des transactions
    Par lio33 dans le forum Débuter
    Réponses: 4
    Dernier message: 23/11/2005, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo