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] LOCK TABLE WRITE ?


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut [Hibernate] LOCK TABLE WRITE ?
    Bonjour,

    Je developpe une application pour des séances de formation.
    Durant une séance de formation, chaque personne se connecte à l'application via son login. Après avoir choisi la feuille d'exercice correspondante à la séance, un numéro doit lui être attribué et stocké dans une table seance_runtime (id_juge, id_seance, date_debut, date_fin et le numéro).
    La première personne recoit le numéro 1, puis le second le numéro 2 et ainsi de suite mais il n'y a pas d'ordre prédéfini par personne physique.

    Je n'arrive pas a visualiser comment je vais pouvoir incrémenter ce numéro sans avoir un risque d'accès concurrent et que deux personnes ait le même numéro.

    Détail , chaque application est une appli desktop distincte et elles ne partagent rien mise à part la base de données finale.

    Merci d'avance pour vos lumières
    Nico

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Si c'est une simple valeur incrémentée, tu peux régler le problème avec l'utilisation d'une séquence de ta base de données, si elle les supporte.
    Il n'y aura plus de risques d'avoir deux valeurs égales.

  3. #3
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Oui effectivement j'y avais même pas pensé mais vu que je suis sous MySql ca pas le faire pour moi
    Je suis entrain de regarder du coté des LOCK, mais j'y connais pas enorme.

    Edit :

    SI je mets un lock en ecriture sur la table.
    et que je fais une requete du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO seance_runtime SET numero = SELECT MAX(numero) FROM seance_runtime;
    Ya qu'avec les trigger qu'on peut avoir des tables zombies ? (c'est vieux tout ca )
    Je test desuite

    re-edit:
    Loupé, ca ne fonctionne pas mais je m'en doutais !

    Merci,
    Nico

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Par défaut
    En MySQL il n'y a pas de séquence mais il y a l'auto-incrémentation, ce qui correspond au même.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Oui mais est-ce que cela garantit qu'on ne peut pas avoir deux valeurs identiques en cas d'accès simultané.
    Il me semble avoir lu le contraire dans une doc.
    A vérifier.

  6. #6
    Membre averti
    Inscrit en
    Octobre 2004
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 45
    Par défaut
    Tu peux aussi peut etre regarder du coté des champs timestamp et version qui permettent de gérer la concurrence d'accès.

  7. #7
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 309
    Par défaut
    Citation Envoyé par fr1man
    Oui mais est-ce que cela garantit qu'on ne peut pas avoir deux valeurs identiques en cas d'accès simultané.
    Il me semble avoir lu le contraire dans une doc.
    A vérifier.
    Je n'ai rien vu sur ce problème, mais je ne suis pas un expert MySQL.

  8. #8
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Citation Envoyé par Christophe P.
    En MySQL il n'y a pas de séquence mais il y a l'auto-incrémentation, ce qui correspond au même.
    Citation Envoyé par fr1man
    Oui mais est-ce que cela garantit qu'on ne peut pas avoir deux valeurs identiques en cas d'accès simultané.
    Il me semble avoir lu le contraire dans une doc.
    A vérifier.
    Si un vérrou spécial est posé AUTO-INC et assure que chaque utilisateur est une entrée différente même dans deux transactions différentes, ce qui eplique les trous si une transaction est annulée.
    Citation Envoyé par bumbo500
    Tu peux aussi peut etre regarder du coté des champs timestamp et version qui permettent de gérer la concurrence d'accès.
    En faite c'est pas une gestion de la concurence sur l'écriture d'une ligne, mais la concurence sur la lecture d'une ligne.

    Il faudrait que je puisse vérouiller en lecture exclusif les lignes que je viens de lire dans ma transaction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(numero) FROM seance_runtime GROUP BY seance = ?
    Je peux ainsi garantir que personne d'autre ne puisse recupérer le numéro identique.
    J'ajoute ma nouvelle ligne et je libère. Une autre personne peux ainsi vérouiller la table et ainsi de suite.
    Je ne penses pas que le timestamp ou la version puisse faire cela.

    Il pour l'utilisation de l'autoncremente, ca va pas tout a fait car il faut qu'a la prochaine séance, la numérotatyion recommence à 1 !

    Je regarde la doc mysql pour voir ce que je pourrais faire en code natif !
    Mais j'ai aussi peur qu'hibernate ne suive pas derrière, a mon que je l'oblige de lire l'information en base de données et non pas dans le cache !

    Enfin galère quoi, j'ai pas de soluce pour le moment

  9. #9
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Que pensez vous de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LOCK TABLES seance_runtime WRITE
    Que va dire hibernate devant ca ?

  10. #10
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Je relance le sujet car je n'ai pas trouvé de réelles solutions pour le moment.

    Pour être précis j'utilise Hibernate Entity Manager et la seule chose qu'il me permet de faire c'est un LockModeType.READ et LockModeType.WRITE qui n'impacte que l'entité que l'on choisi, le premier pour assurer la lecture coherente et l'autre pour en plus de ca, obliger l'incrementation du numéro de version.
    Donc ca ne convient pas a mon problème.

    Sinon je pensais faire un lock table avec un requete natif, mais je ne sais pas comment va réagir hibernate
    Quelqu'un aurait il une expérience dans ce genre de situation ?

    Merci

  11. #11
    Membre émérite
    Avatar de n!co
    Profil pro
    Inscrit en
    Février 2004
    Messages
    831
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 831
    Par défaut
    Bon j'ai trouvé une solution en partant sur une autre voie.

    J'ai rajouté une contrainte d'unicité sur mes champs (id_seance, numero).
    Comme ca j'ai juste a gérer les erreurs de contrainte et boucler jusqu'a ce que le juge recupère un numéro unique.

    C'est finalement plus logique qu'un lock de la table

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

Discussions similaires

  1. Lock table
    Par amelie6 dans le forum Oracle
    Réponses: 8
    Dernier message: 03/09/2011, 16h29
  2. LOCK TABLE WRITE qui bloque la lecture.
    Par renaudjuif dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 03/02/2007, 00h15
  3. syntaxe de lock tables
    Par pas30 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 31/12/2006, 00h54
  4. Lock Table ?
    Par 000 dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/05/2006, 13h51
  5. LOCK TABLES et TRUNCATE TABLE
    Par killy-kun dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/08/2005, 15h52

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