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 :

Probleme sur les transactions spring [Data]


Sujet :

Spring Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Probleme sur les transactions spring
    Bonjour,

    J'ai un problème sur mes transactions spring.
    J'utilise mysql5, tomcat 5.0, hibernate 3 et spring 2, struts.
    J'ai suivi toutes infos trouvés sur le web.

    Lorsque je fais une transaction dans un service avec
    - methode1()
    - methode2()
    (sachant que la methode 2 ne va pas fonctionner, exemple update sur une ligne non existante)
    la méthode 1 passe quand même.

    Ensuite, j'ai mis dans ma data source la propriété defaultAutoCommit à false.
    Dans ce cas, methode1 ne passe pas (très bien).
    Mais si je rends valide la methode2, elle ne passe pas non plus.
    En fait, rien n'est committé.

    Avez vous déja eu ce problème ?

    Je vous remercie d'avance.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Tout dépend comment tu déclares les attributs de transaction de tes méthodes.
    ex: PROPAGATION_REQUIRES_NEW, PROPAGATION_NEVER, etc...

    Il faudrait peut-être mettre les appels à méthode1 et méthode2 dans une nouvelle méthode et appliquer une transaction globale avec un PROPAGATION_REQUIRED à cette nouvelle méthode.

    Il faut vérifier que tu utilises bien InnoDB qui est le moteur de mysql qui supporte les transactions. Je ne crois pas que les autres moteurs les supportent.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Tout d'abord, je te remercie d'avoir répondu.

    J'utilise un dialect INNODB
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect

    Et j'utilise un REQUIRED
    <property name="transactionAttributeSource">
    <props>
    <prop key="*">PROPAGATION_REQUIRED</prop>

    Il y a peut-être qqch à modifier sur la base de donnée pour la valeur INNODB ?
    Je ne suis pas spécialiste des SGBD ...

    Merci.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Mes tables sont aussi INNODB

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Donc ca a l'air bon coté BD.

    Pour être certain de bien comprendre ce que tu veux.
    Tu voudrais que methode1 et methode2 fassent partie d'une même transaction ?
    C'est ça ?

    Car avec ce que tu as déclaré, tu vas avoir deux transactions séparées, sauf si l'appel de tes deux méthodes est dans une troisieme méthode, pour n'avoir qu'une transaction

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Effectivement, je voudrais que methode1 et methode2 fassent parties de la même transaction.

    Dans mon service, j'ai :
    {
    daoX.methode1()
    daoY.methode2()
    }

    Mes dao héritent de HibernateDaoSupport.
    Ils fonctionnent donc avec les templates.

    Et j'ai donc un PROPAGATION_REQUIRED sur *

    Comment faire alors pour que methode1 et methode2 fasse partie de la même transaction ?

  7. #7
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Points : 3 736
    Points
    3 736
    Par défaut
    tu as declaré comment la transaction au niveau du service ? tu as utilise @Transactionnal ? ou dans la conf ? essaye de donner un peu plus de ta conf xml

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Voici ma configuration xml

    Code xml : 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <!-- === Start of PERSISTENCE DEFINITIONS ======= -->
    <bean id="dataSource"
    	class="org.springframework.jndi.JndiObjectFactoryBean">
    	<property name="jndiName">
    		<value>jdbc/wpcDS</value>
    	</property>
    	<property name="resourceRef">
    		<value>true</value>
    	</property>
    </bean>
     
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    	<property name="configLocation">
    		<value>WEB-INF/hibernate.cfg.xml</value>
    	</property>
    	<property name="dataSource"><ref local="dataSource"/></property>
    	<property name="hibernateProperties">
    		<props>
    			<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
    			<prop key="hibernate.show_sql">false</prop>
    			<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
    			<prop key="hibernate.hbm2ddl.auto">none</prop>
    		</props>
    	</property>
    </bean>
     
    <!-- ===== Start of SERVICE DEFINITIONS ===== -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    	<property name="sessionFactory"><ref bean="sessionFactory" /></property>
    </bean>
     
    <bean id="familleService" autowire="autodetect" class="com.entreprise.wpc.service.FamilleService"/>
     
    <bean id="transactionalProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    	<property name="transactionManager"><ref local="transactionManager" /></property>
    	<property name="target"><ref local="familleService" /></property>
    	<property name="transactionAttributes">
    		<props>
    			<prop key="*">PROPAGATION_REQUIRED</prop>
    		</props>
    	</property>
    </bean>
     
    <!--==== Start of PERSISTENCE DEFINITIONS ===== -->
    <bean id="familleDAO" class="com.entreprise.wpc.persistance.hibernate.FamilleDAO">
    	<property name="sessionFactory"><ref local="sessionFactory" /></property>
    </bean>

  9. #9
    Membre régulier
    Inscrit en
    Octobre 2002
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 108
    Points : 98
    Points
    98
    Par défaut
    Comment as tu récupéré ton service. Il ne faut pas oublier d'utiliser le proxy (transactionalProxy dans ce cas) au lieu du service lui même (familleService).

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Pour récupérer mon service, j'ai utilisé familleService dans une action struts toute simple :

    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
     
    private IFamilleService familleService;
     
    public IFamilleService getFamilleService() {
        return familleService;
    }
     
    public void setFamilleService(IFamilleService familleService){
        this.familleService = familleService;
    }
     
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response){
        String result = "succes";
        FamilleForm theForm = (FamilleForm)form;
        familleService.enregistrerFamille(theForm.getCode(),
        			theForm.getLibelle());
     
        return mapping.findForward(result);
    }
    et je l'ai paramétré de cette façon dans un fichier de configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <bean name="/famille" class="com.entreprise.wpc.presentation.action.FamilleAction" autowire="byName" singleton="false">
    </bean>
    Je viens de comprendre mon erreur.
    En fait, je mappe directement mon bean de service dans mon action struts au lieu de mapper le bean proxy.

    Pour que ce soit bon, il faut que je change soit mon fichier de configuration (changement du nom transactionalProxy en familleService) ou soit mon action struts (public IFamille transactionalProxy; ... getTransactionProxy, set transactionalProxy).
    Je pense que le plus juste est de modifier mon fichier de configuration. Ainsi, il devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <bean id="target" autowire="autodetect" class="com.entreprise.wpc.service.FamilleService"/>
     
    <bean id="familleService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    	<property name="transactionManager"><ref local="transactionManager" /></property>
    	<property name="target"><ref local="familleService" /></property>
    	<property name="transactionAttributes">
    		<props>
    			<prop key="*">PROPAGATION_REQUIRED</prop>
    		</props>
    	</property>
    </bean>
    Je vous remercie tous pour votre aide ...
    qui valide le choix de Spring pour mon architecture.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Juste une petite erreur dans ma correction, il faut voir

    <property name="target"><ref local="target" /></property>

    et non familleService en référence locale.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. question sur les transactions
    Par vbcasimir dans le forum Débuter
    Réponses: 3
    Dernier message: 07/06/2005, 10h15
  2. [C#] Probleme sur les clés primaires composites
    Par stardeus dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/02/2005, 23h28
  3. petite aide sur les transactions et triggers SVP
    Par CharleLéo dans le forum Débuter
    Réponses: 4
    Dernier message: 15/11/2004, 20h43
  4. MS Access et TQuery (probleme sur les dates)
    Par Djob dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/06/2004, 14h57
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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