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 :

Locker un Entity


Sujet :

JPA Java

  1. #1
    Invité(e)
    Invité(e)
    Par défaut Locker un Entity
    Bonsoir,

    après divers tests je me suis rendu compte que mes Entity n'étaient pas lockés !
    J'utilise un EntityManager pour gérer les transactions, en revanche celui ci ne gère pas les locks et je me retrouve donc avec des données non conhérentes.

    j'ai utilisé cette annotation, sur mes Entity, mon Manager ainsi que sur la méthode que je souhaite appeler mais rien y fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @TransactionAttribute(TransactionAttributeType.REQUIRE)
    avez vous une idée sur la marche à suivre pour bloquer les Entity lors d'accès concurrents ?

    merci beaucoup

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    bonjour,

    context du problème:
    Je me suis mis en situation de deadlock pour pouvoir voir comment cela fonctionnait. Je rencontre un problème transactionnel ou les lock sur entity ne sont pas effectués.

    j'ai pourtant fait comme sur ce post
    mais rien ne change niveau transactionnel.

    J'ai fait un test avec deux méthodes

    la méthode 1 appel un entity par le biais d'un manager
    je modifie cet entity
    je fais une boucle très longue pour générer un temps d'attente assez long pour pouvoir tester mon deadlock
    puis je remodifie cet entity

    la méthode 2 appel le même entity que dans la méthode 1
    l'appel de cette méthode est lancé pendant l'execution de la boucle de la méthode 1.

    déroulement:

    appel méthode 1
    .....récupération de l'entity 1
    .....modification de l'entity 1
    .....boucle
    ..........appel de la méthode 2 via un nouveau client pendant la boucle
    ..........récupération de l'entity1
    ..........modification de l'entity 1
    .....fin de la boucle
    .....modification de l'entity 1

    Constat attendu:
    la méthode 1 récupère l'entity
    lock
    la méthode 1 modifie l'entity
    boucle
    fin boucle
    la méthode 1 modifie l'entity
    libération du lock
    la méthode 2 récupère l'entity
    lock
    la méthode 2 modifie l'entity
    libération du lock

    résultat obtenu:
    la méthode 1 récupère l'entity
    la méthode 1 modifie l'entity
    boucle dans la méthode 1
    la méthode 2 récupère l'entity
    la méthode 2 modifie l'entity
    fin boucle dans la méthode 1
    la méthode 1 modifie l'entity

    du coup l'entity est modifié par la méthode 2 alors que normalement un lock aurait du être posé, ce qui fait que le traitement effectué par la méthode 2 est écrasé ! je ne vois pas d'où peu provenir le soucis

    j'espère avoir été assez explicite !

    merci beaucoup

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    je viens de me rendre compte que certaine personnes ajoute ceci à leur fichier de persistence.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <property name="hibernate.transaction.manager_lookup_class"   value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
    <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/>
    quand j'ajoute ceci, j'ai un message m'indiquant que je ne peu joindre de transaction au moment de l'exécution de ma méthode, aisni la récupération et la modification de l'entity fonctionne bien mais pas la persistance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    10:29:55,781 WARN  [AbstractEntityManagerImpl] Cannot join transaction, not a JoinableCMTTransaction
    je pense que je dois donc mal configurer mon fichier de persistence.xml !
    comment savoir exactement ce que l'on doit mettre en paramètres ?

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    je ne sais pas si j'ai assez ou trop explicité mon problème.

    Dernière constatation, il semblerai que mes transactions fonctionnent lorsque je rajoute un flush après la récupération de mon Entity.

    tous les autres clients invoquant l'Entity utilisé par un client qui à invoquer le flush, attendent que la ressource soit libérée avant de modifier l'intégrité des données.

    JE me retrouve donc avec des données cohérentes maintenant

    la question reste pourquoi cela fonctionne t-il ainsi ?

    d'après L'API sun

    le flush synchronise le contexte avec la base de donnée. Mais en quoi cela dit qu'un lock est mis en place ?
    surtout que cela ne m'empêche pas d'accéder à l'Entity en lecture !

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Je suis parvenu à créer un deadlock c'est "bon signe" cela veut dire que mes lock fonctionnent

    en revanche je ne suis pas convaincu de ma manière de procéder.

    en faite je lock l'entity par le biais de l'entitymanager comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TachesPriorite tachePriorite = entityManager.find(TachesPriorite.class, 1);
    entityManager.lock(tachePriorite, LockModeType.WRITE);
    entityManager.refresh(tachePriorite);
     
    tachePriorite.setType("priorité");
    est ce correct ?
    Dernière modification par Invité(e) ; 02/07/2008 à 17h57.

Discussions similaires

  1. [Eclipse / Jonas] Erreur "jonas-entity missing for bean"
    Par citygirl dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 16/05/2005, 12h59
  2. [EJB2.1 Entity] No Such entity
    Par Electrochip dans le forum Java EE
    Réponses: 5
    Dernier message: 06/01/2005, 21h26
  3. [Debutant][Conception][appli] locker une application
    Par floweez dans le forum Général Java
    Réponses: 6
    Dernier message: 25/11/2004, 10h22
  4. [CVS] "locker" un fichier sous eclipse
    Par Yan83 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 10/04/2004, 16h55
  5. [ Entity bean ] CMP
    Par hocinema dans le forum Websphere
    Réponses: 5
    Dernier message: 03/10/2003, 12h33

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