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

Hibernate Java Discussion :

Hibernate et pb de synchro/atomicité


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 15
    Points : 6
    Points
    6
    Par défaut Hibernate et pb de synchro/atomicité
    Salut,
    J'ai un gros pb avec Hibernate.
    J'utilse une table User et j'ai 2 accès concurrents (via des methodes web services) à une même entrée de ma table mysql.
    Chaque methode permet de modifier un champ specifique de mon entrée.
    J'ai qq chose du genre :
    Methode1
    User user = get(user);
    try {
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();

    user.setData1(data1);

    session.update(user);

    transaction.commit();
    session.close();

    } catch (HibernateException e) {
    e.printStackTrace();
    }

    Methode2
    User user = get(user);
    try {
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();

    user.setData2(data2);

    session.update(user);

    transaction.commit();
    session.close();

    } catch (HibernateException e) {
    e.printStackTrace();
    }

    Le problème est que mes 2 accès sont appelés en parallèle et mes objets User ne sont pas synchronisés. Pb d'atomicité ou je ne sais pas quoi.
    Mes 2 process appellent getUser (query select sur bdd) on va dire en même temps. Par contre si la donnée 1 est modifiée par le premier process, cette modif n'est pas prise en compte et est écrasée par le 2è process en positionnant la donnée 2.
    Comment puis-je faire ?
    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Il faut locker les objets que tu vas modifier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    User user = (User) session.load(id, LockMode.UPGRADE);
     
    user.setData1(data1);
     
    session.update(user);
     
    transaction.commit();
    session.close();
     
    } catch (HibernateException e) {
    e.printStackTrace();
    }
    Sinon tu as le optimistic locking, en gros celui qui comitte en 2e s'aperçoit que quelqu'un a comitté avant lui et il rollback sa transaction (et renvoie une exception).

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Ok, merci je vais tenter un lock. J'imagine que c'est unlocker au moment du commit. L'id, c'est bien l'identifiant de ma table (clé primaire) ? Pour ma part, je fais une query de type select pour récupérer le user directement avec un iterate sans passer par un load.

    Pour la 2è solution, ça me pose pb car je veux que mes deux modifs soient executées (pas de rollback).

    Sinon, j'ai 2 questions :
    - Est il possible de configurer les tables pour que l'update ne se fasse que sur la colonne (ou le champ) concernée ?

    - Y'a t-il moyen de faire une requête d'update comme ceci :
    String hqlUpdate = "update User u set u.data1 = :mydata1 where u.name = :name";
    int updatedEntities = s.createQuery( hqlUpdate )
    .setString( "name", name )
    .setString( "mydata1", mydata1 )
    .executeUpdate();
    tx.commit();
    session.close();
    Chez moi, ça plante... j'ai trouve un updatedEntities egual à 1 mais mon entrée n'est pas modifiée.
    Merci.

  4. #4
    Futur Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par the-gtm Voir le message
    Il faut locker les objets que tu vas modifier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();
    User user = (User) session.load(id, LockMode.UPGRADE);
     
    user.setData1(data1);
     
    session.update(user);
     
    transaction.commit();
    session.close();
     
    } catch (HibernateException e) {
    e.printStackTrace();
    }
    Sinon tu as le optimistic locking, en gros celui qui comitte en 2e s'aperçoit que quelqu'un a comitté avant lui et il rollback sa transaction (et renvoie une exception).
    User user = (User) session.load(id, LockMode.UPGRADE); m'a généré une exception.
    J'ai fait un session.lock(user, LockMode.UPGRADE);
    Mais ça n'a pas eu l'air de changer grand chose.
    Dans mes 2 méthodes (gérées pas 2 process), j'utilise 2 sessions différentes, est-ce bon ?
    Help !!

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    C'est quoi l'exception?

Discussions similaires

  1. pb de conception hibernate / synchro des donnés
    Par DevForFun dans le forum Persistance des données
    Réponses: 3
    Dernier message: 23/11/2012, 14h09
  2. Hibernate et synchro de DB
    Par Alec6 dans le forum Hibernate
    Réponses: 0
    Dernier message: 14/04/2011, 11h44
  3. synchro Caches hibernate
    Par debutanteVB.NET dans le forum Hibernate
    Réponses: 4
    Dernier message: 14/05/2008, 09h15
  4. [JDO]Hibernate : Mapping d'un champ auto-incrémenté
    Par brice.antoine dans le forum Hibernate
    Réponses: 4
    Dernier message: 02/04/2004, 10h36
  5. VGA : synchro verticale (et horizontale ?)
    Par Blustuff dans le forum Assembleur
    Réponses: 19
    Dernier message: 21/06/2003, 08h46

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