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 :

Rollback d'une Transaction Au niveau service lors d'une exception métier [Data]


Sujet :

Spring Java

  1. #1
    Membre régulier Avatar de 17mounir
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2005
    Messages : 101
    Points : 78
    Points
    78
    Par défaut Rollback d'une Transaction Au niveau service lors d'une exception métier
    Salut,

    j'utilise Spring et Hibernate, pour les transaction elle démarrent niveau service (j'utilise les annotations sur les méthodes)

    Lors d'une sauvegarde :
    - Est ce que c'est possible de faire un rollback de la transaction (créee dans le service) si une règle métier n'est pas satisfaite (génération d'une exception) sachant que j'ai pas encore invoqué le save de la DAO)

    Pour retrouver en fait mon objet d'entrée du service qui a pû être modifié avant qu'une exception de règle métier non satisfaite se déclenche)

    Sais pas si j'été assez clair !


    Merci

  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
    Je crois qu'en cas d'exception, pas défaut, la transaction est annulée.
    Si ce n'est pas le cas, tu peux le paramétrer au niveau de la config spring.

  3. #3
    Membre régulier Avatar de 17mounir
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2005
    Messages : 101
    Points : 78
    Points
    78
    Par défaut
    Oui mais j'ai cru comprendre que :
    Quand l'exception n'est pas généré dans la couche DAO (requete sql) le rollback ne va pas me restituer mon objet

    Ce que je cherche c'est faire un gerstionnaire de transaction objet qui rollback mais objet avant d'arriver en BD

  4. #4
    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
    Quand je parle de transaction annulée, je parle de rollback, donc que rien n'est écrit en base.
    Tout le code Hibernate se trouvant dans ta transaction sera rollbacké.

  5. #5
    Membre régulier Avatar de 17mounir
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2005
    Messages : 101
    Points : 78
    Points
    78
    Par défaut
    Oui, mais moi je cherche à rollbacker du code métier qui n'a pas de lien avec hibernate :

    Exemple : des modifications et traitements d'un objet avant la sauvegarde si je ne peu pas faire toute les modifications pour une raison quelconque je veux retrouver mon objet d'entrée

    Voilà mon PB

  6. #6
    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
    Fais une copie de ton objet avant de le modifier, comme ça, en cas d'exception, tu peux récupérer cette copie non modifiée.

  7. #7
    Membre actif Avatar de tnodev
    Profil pro
    SSSSS
    Inscrit en
    Mai 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : SSSSS

    Informations forums :
    Inscription : Mai 2005
    Messages : 182
    Points : 231
    Points
    231
    Par défaut
    Bonjour

    Les transactions Spring sont encapsulées par un proxy. C'est le résultat de ta méthode de la classe qui va donc entrainer le mécanisme de commit ou rollback.

    Tu peux donc définir toutes les exceptions qui vont entrainer le rollback...

    voici comment je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      <bean id="baseTransactionProxyArcService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
        <property name="transactionManager">
          <ref bean="transactionManagerArcService" />
        </property>
        <property name="transactionAttributes">
          <props>
            <prop key="save*">PROPAGATION_REQUIRED,-DataAccessException,-CommonException</prop>
            <prop key="delete*">PROPAGATION_REQUIRED,-DataAccessException,-CommonException</prop>
            <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
          </props>
        </property>
      </bean>

  8. #8
    Membre régulier Avatar de 17mounir
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2005
    Messages : 101
    Points : 78
    Points
    78
    Par défaut
    Salut !

    J'ai essayé le TransactionProxyFactoryBean mais il semble ne pas marcher (une erreur d'utilisation peu être)


    Couche Ihm / Uc
    ----------------
    O.setEtat("A");
    monService.save(monObjet);

    Couche métier @Transactional : REQUIRED
    --------------
    save(Object o) {

    verifier(o);
    O.setEtat("B");
    traitementMetier(o)

    dao.save(O);
    }

    Mon besoin :
    ------------

    Si une exception est générée dans la méthode traitementMetier() de la couche métier (Avant d'appeler la DAO), la transaction doit être rollbackée et mon objet dans couche supérieur Ihm/Uc doit être dans l'état précédant l'appel à la couche métier c'est à dire O.getEtat() vaut "A"

    Est ce que ceci peu être géré avec un service issue de TransactionProxyFactoryBean ?

  9. #9
    Membre actif Avatar de tnodev
    Profil pro
    SSSSS
    Inscrit en
    Mai 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : SSSSS

    Informations forums :
    Inscription : Mai 2005
    Messages : 182
    Points : 231
    Points
    231
    Par défaut
    En fait, tu veux gérer une transaction au niveau java...
    Tu peux le faire simplement (je crois...)

    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
    Couche métier @Transactional :  REQUIRED
    --------------
    save(Object o)  {
    
    verifier(o);
    O.setEtat("B");
    traitementMetier(o)
    
    dao.save(O);
    }
    
    saveAndCheck(Object o) {
         Object currentEtat = o.getEtat();
    try {
        // TRANSACTION SQL
        save(o);
    } catch (Exception) {
        o.setEtat(currentEtat);
    }
    }
    Après tu peux t'amuser à définir ton propre proxy pour la gestion de l'état...

  10. #10
    Membre régulier Avatar de 17mounir
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2005
    Messages : 101
    Points : 78
    Points
    78
    Par défaut
    C'est la solution que j'espère éviter car je travaille avec une grappe d'objets assez grande, et je voulais éviter de faire des clones.

  11. #11
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Points : 6 301
    Points
    6 301
    Par défaut
    De toute manière, même s'il existait un moyen de récupérer l'état de l'objet dans le cas d'un rollback, cela se baserait sans doute sur une copie de l'état avant de rentrer dans la méthode, état qui serait restoré dans le cas d'une exception.

    Donc au final, il y aurait quand meme un clone temporairement.
    Je ne vois pas d'autre "moyen" de faire ce que tu demande.

  12. #12
    Membre régulier Avatar de 17mounir
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2005
    Messages : 101
    Points : 78
    Points
    78
    Par défaut
    Oki ci noté !

    Merci à vous tous :-)

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

Discussions similaires

  1. Problème inconnu lors d'une mise à jour de Services Web
    Par The eye dans le forum Services Web
    Réponses: 1
    Dernier message: 01/12/2010, 13h26
  2. Réponses: 3
    Dernier message: 30/04/2010, 00h08
  3. niveau d'isolation d'une transaction
    Par grome dans le forum Développement
    Réponses: 7
    Dernier message: 02/12/2008, 13h02
  4. Firebird : Erreur lors d'une mise a niveau.
    Par TryExceptEnd dans le forum Administration
    Réponses: 4
    Dernier message: 24/10/2008, 20h18
  5. Conversion du type DATETIME lors d'une transaction distribuée
    Par Erwan1978 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/01/2008, 11h06

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