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

JPA Java Discussion :

comment peux-t-on exécuter 2 transactions dans une même méthode


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 139
    Par défaut comment peux-t-on exécuter 2 transactions dans une même méthode
    bonjour,

    est ce que vous connaissez comment 2 transactions peuvent s'exécuter dans une même méthode;en effet,j'ai créé une procédure pour la création d'un enregistrement dans une table(bien sur elle contient le begin et le commit d'une transaction),et je veux dans une autre procédure,appeller deux fois de suite la procédure de création,
    mais le problème c'est que le premier appel réussit,et je ne sais pas pourquoi le deuxième appel ne s'exécute pas,
    est ce que vous avez une idée?
    merci

  2. #2
    Membre expérimenté

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Par défaut
    Peux-tu donner un peu plus de détails?
    Dans quel contexte es-tu?
    Un serveur d'appli ou non? La gestion des transaction est-elle ou peut-elle être déléguée au serveur?
    A priori en lisant ton problème je pense qu'il y a une gestion manuelle de transaction.
    Peux-tu nous donner les morceaux de code qui managent les transactions ?

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 139
    Par défaut
    salut,
    tout d'abord quand j'ai posté ce message, la methode createrectif() a été entourée par un begin et commit d'une transaction,et puis recherche() fait l'appel 2 fois de createrectif()(càd il s'agit de 2 transactions),mais ça n'a pas marché,alors j'ai changé la méthode recherche() de telle façon à l'entourer d'un seul couple begin commit d'une transaction, le problème c'est que c'est seulement le deuxième appel de createrectif() qui s"exécute,
    voilà le code:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     public void createrectif(Long npch,Integer montant)
        {   EntityManager em = getEntityManager();    
            List<Operation> oper=  em.createQuery("select object(o) from Operation as o where (o.npch=:n)")
                       .setParameter("n",operation.getNpch()).getResultList();
                     if(!oper.isEmpty())
               {
            montantfromquery=oper.get(0).getMontant();
              operation.setNpch(npch); 
              operation.setCodActiv(oper.get(0).getCodActiv());
               operation.setCodCaisse(oper.get(0).getCodCaisse());
               operation.setCodTransac(oper.get(0).getCodTransac());
               operation.setDateOp(oper.get(0).getDateOp());
               operation.setDateVersm(oper.get(0).getDateVersm());
               operation.setImpAnal(oper.get(0).getImpAnal());
               operation.setImpBudi(oper.get(0).getImpBudi());
               operation.setMatriculeAgent(oper.get(0).getMatriculeAgent());
               operation.setMoisPaie(oper.get(0).getMoisPaie());
               operation.setMontantht(oper.get(0).getMontantht());
               operation.setNpch(oper.get(0).getNpch());
               operation.setNumMandat(oper.get(0).getNumMandat());
               //***montant soit =(-op.getMontant)soit = nouveau montant
               operation.setMontant(montant);
        }
        }
         public String recherche() {
              EntityManager em = getEntityManager();
            try{
           //====================================
                         utx.begin();
                createrectif(operation.getNpch(),operation.getMontant()); 
             n=montantfromquery;
             createrectif(operation.getNpch(),-n);
                   em.persist(operation); 
     
            utx.commit();           
     
              } catch (Exception ex) {
                try {                
                        ensureAddErrorMessage(ex, "A persistence error occurred.");
                 utx.rollback();
                } catch (Exception e) {
                   e.printStackTrace();
                    ensureAddErrorMessage(e, "An error occurred attempting to roll back the transaction.");
                }
                //return null;
            }finally{em.close();}
     
             return listSetup();
            }
    est ce que tu as une idée?
    merci

  4. #4
    Membre expérimenté

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Par défaut
    Je suis pas sur d'avoir compris tout ce que fait ton code...;
    A priori tu as deux attributs dans ta classe qui s'appele "operation" et "montantfromquery"
    (au passage pour la lisibilité, il faudrait respecter les convention de nommage avec "lower camel case" et faire montantFromQuery et createRectif)

    Si on prend ton algo :
    -ouvre transaction
    -appel createrectif qui change la valeur de operation et montantfromquery
    -appel createrectif qui change la valeur de operation et montantfromquery
    -appel de persist sur operation
    -commit
    Comme le premier état de operation n'est jamais passé en paramètre du persist, il est normal que les modification ne se voit pas en base.

    Attention si tu appelles le persist apres le premier appel à createrectif et le deuxieme, tu ne verras pas les modifications n'ont plus car ta référence à opération ne change jamais. Tu n'as qu'une seule instance de l'objet et donc qu'une seule ligne en base.

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 139
    Par défaut
    bonjour,
    merci pour toi, mais je veux te dire que j'ai essayé d'introduire une 2ième instance de Operation après un premier persist et puis faire le 2ième persist,mais ça n'a pac marché,voilà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       utx.begin();
                createrectif(operation.getNpch(),operation.getMontant()); 
             em.persist(operation);
              //** variable npch pour récupérer "operation.getNpch()" qui va être perdu par la suite
            Long npch=operation.getNpch();
            operation=new Operation();
    //"montantfromquery" c'est une variable globale qui se charge dans le premier appel de createrectif()
    // et puis "n" prend la valeur de "montantfromquery" parce que la dernière va être modifier dans le deuxième appel de createrectif(),
                n=montantfromquery;
             createrectif(npch,-n);
                   em.persist(operation); 
     
            utx.commit();
    et voilà ce que m'a donné le stack trace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    javax.transaction.RollbackException: La transaction a été marquée comme devant être annulée.
            at com.sun.enterprise.distributedtx.J2EETransaction.commit(J2EETransaction.java:440)
            at com.sun.enterprise.distributedtx.J2EETransactionManagerOpt.commit(J2EETransactionManagerOpt.java:371)
            at com.sun.enterprise.distributedtx.UserTransactionImpl.commit(UserTransactionImpl.java:197)
            at newpackage.OperationController.recherche(OperationController.java:143)
           ....
    est ce qu'il ya une autre méthode pour faire ça?
    merci

  6. #6
    Membre expérimenté

    Avatar de christopheJ
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 600
    Par défaut
    As-tu une nested exception dans la stacktrace?

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/05/2012, 23h22
  2. Réponses: 4
    Dernier message: 20/04/2011, 12h20
  3. Réponses: 10
    Dernier message: 03/04/2008, 16h58
  4. Comment faire interagir C/C++ et Python dans un même exécutable ?
    Par Amybond dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 06/05/2007, 17h08
  5. Réponses: 1
    Dernier message: 10/02/2007, 21h30

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