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

Java EE Discussion :

[CMT] Gestion d'exception et transaction [EJB Session]


Sujet :

Java EE

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Par défaut [CMT] Gestion d'exception et transaction
    J'ai un EJB Session Stateful avec transaction de type Container et je voulais savoir si ceci est réalisable:

    Voici une méthode de cet EJB:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try {
         blablabla
    }
    catch (Exception e) {
         doSomething()
    }
         doSomethingElse()
    Lorsque aucune exception est levée, tout ce qui est fait dans doSomethingElse est commité c'est le fonctionnement normal du Container.

    Lorsque une exception est levée je voudrais que tout ce qui est fait dans le catch (le doSomething) soit lui commité.

    Le probleme c'est que aujourd'hui toute ma transaction est rollbackée.

  2. #2
    Membre expérimenté Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Par défaut
    A mon avis, tu ne catche pas l'exception. Dans le code présenté tu catche tout ce qui est de type Exception. Donc toutes les RuntimeException (NullPointer, etc...) ne sont pas catchées par ton code mais par le container qui réalise alors un rollback.
    Change Exception par Throwable, et regarde si çà marche.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Par défaut
    Alors en fait je n'ai pas été complet:

    voici plutot la portion de code que j'execute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try {  
            doSomethingElse()
     } catch (IllegalStateException e) {  
            doSomething()
            throw e;
    }
    Dans le catch je renvoie l'exception dans l'idée justement de rollbacker tout ce qui a pu etre fait en amont ... le fond de la question est donc de savoir si il existe un moyen pour que tout ce qui est fait dans doSomething soit commité tout en rollbackant ce qui a pu etre fait dans le doSomethingElse ... hmm hmm je sais pas si c'est tres clair ...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 17
    Par défaut
    En mettant ton doSomething() dans un finally par exemple ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    boolean flag=false
    try { 
    doSomethingElse()
    } catch (IllegalStateException e) {
    flag=true;
    throw e; 
    }
    finally{if(flag)  doSomething() ;}

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 6
    Par défaut
    Non ca ne marche pas mieux ...

    Le doSomething() contient des ordres d'update dans une base de donnée mais je pense que la transaction est marquée rollbackée à partir du moment ou l'exception est levée et donc tout ce qui est fait dans le doSomething est lui aussi rollbacké ...

    L'orde d'update dans le doSomething leve cette trace:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [TxInterceptorCMT] IllegalStateException while setting transaction for rollback only
    java.lang.IllegalStateException: Already rolled back. TransactionImpl:XidImpl[FormatId=257, GlobalId=fr-31-01-05-072/17, BranchQual=, localId=17]
    	at org.jboss.tm.TransactionImpl.setRollbackOnly(TransactionImpl.java:691)

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Et si tu indiquais un "RequiresNew" comme attribut de transaction pour la méthode doSomething(), qu'est-ce que ça donne ? Parce que dans ce cas, la méthode doSomething() s'exécuterait dans une autre transaction, commiterait, puis rendrait la main pour relancer l'autre transaction rollbackée. Bon, j'ai pas encore vérifié ça, si tu peux nous dire ce qu'il en retourne.

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

Discussions similaires

  1. [Framework] Question sur la gestion des exceptions et du @Transactional
    Par franckbis dans le forum Spring
    Réponses: 0
    Dernier message: 13/01/2010, 11h53
  2. Gestion des exception (EOleException)
    Par shurized dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/06/2004, 17h25
  3. [C#] Gestion d'exception
    Par ALCINA dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 12h18
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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