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

Requêtes MySQL Discussion :

Verrouiller un enregistrement et empêcher sa lecture


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Par défaut Verrouiller un enregistrement et empêcher sa lecture
    Bonjour,

    Plusieurs utilisateurs accèdent de manière concurrente à un enregistrement précis d'une table innoDB pour le lire puis le modifier.
    Je souhaite que tant qu'un de ces utilisateurs n'a pas encore fini d'écrire aucun des autres ne puisse ne serait-ce que lire l'enregistrement en question.

    J'ai regardé du côté des transaction et du SELECT FOR UPDATE (entre autre sur le forum), mais il semble que cela n'empêcherait que l'écriture et pas la lecture. Or il est impératif qu'au moment où un utilisateur modifie l'enregistrement les valeurs qu'il a récupérées lors du SELECT n'aient pas changé car elles conditionnent un calcul.

    Merci.

  2. #2
    Membre chevronné Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Par défaut
    Je t'invite a consulter la documentation de MySql qui est relativement precise sur ce sujet.
    http://dev.mysql.com/doc/refman/5.0/...ing-reads.html

    http://dev.mysql.com/doc/refman/5.0/...locks-set.html

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Par défaut
    Bonjour rberthou,

    Merci pour les liens. Il y a une chose qui n'est pas claire pour moi. Je lis dans le premier lien que SELECT ... FOR UPDATE pose un verrou en même tant qu'il lit une ligne, et que ce verrou est le même qu'un UPDATE. Dans le second lien je lis que le verrou d'un UPDATE est de type exclusif :
    - un verrou exclusif empêche-t'il la lecture? Je n'ai pas trouvé la définition de ce verrouillage
    - cela pose-t'il un problème de faire un SELECT ... FOR UPDATE qui n'est pas suivi d'un UPDATE?
    - entre le SELECT ... FOR UPDATE et l'UPDATE peut-il y avoir d'autres requêtes concernant d'autres tables?

  4. #4
    Membre chevronné Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Par défaut
    Citation Envoyé par CsJoe Voir le message
    - un verrou exclusif empêche-t'il la lecture? Je n'ai pas trouvé la définition de ce verrouillage
    Je pense que la lecture normale est possible mais je ne pesne pas que tu puisse faire un autre select for update sur la données (verifiable facilement avec un client Mysql)

    Citation Envoyé par CsJoe Voir le message
    - cela pose-t'il un problème de faire un SELECT ... FOR UPDATE qui n'est pas suivi d'un UPDATE?
    Non, mais il faudra un commit ou rollback pour liberer les verrous

    Citation Envoyé par CsJoe Voir le message
    - entre le SELECT ... FOR UPDATE et l'UPDATE peut-il y avoir d'autres requêtes concernant d'autres tables?
    Normalement oui si ce n'est pas la meme table, je crain que sur la meme table cela supprime le verrou.

    Si le select for update ne pose pas un verrou suffisant tu peux toujours simuler une mise a jour sur ton enregistrement (mais je ne pense pas que cela soit utile)


    Par contre dans pas mal de cas tu dois pouvoir gérer cela directement en un seul update du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Update ma_table set ma_quantite = ma_quantite - 25 
    where ma_quantite > 25 
     and ma_clef = 'xxx'

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 18
    Par défaut
    J'ai fait un petit test et je suis assez surpris du résultat. L'environnement est WAMP, peut-être que certaines options y sont pour quelque chose? J'ai tenté de simuler deux accès concurrents.

    J'ai créé le fichier a.php (A) qui fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    - SELECT * d'un enregistrement et affichage du résultat
    - sleep de 10 secondes
    - UPDATE du champ "trace" de l'enregistrement pour l'incrémenter de 1 (initialement il vaut 0)
    - SELECT * de l'enregistrement et affichage du résultat
    J'ai créé le fichier b.php (B) qui fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    - SELECT * du même enregistrement et affichage du résultat
    - UPDATE du champ "trace" de l'enregistrement pour l'incrémenter de 1 
    - SELECT * de l'enregistrement et affichage du résultat
    J'ai lancé A puis B tout de suite après, et je m'attendais à obtenir ceci :
    - que A affiche "trace = 0" puis "trace = 2" (car incrémenté plus vite que lui par B)
    - que B affiche "trace = 0" puis "trace = 1"

    Or B a attendu que A se termine et j'ai obtenu ceci :
    - A a affiché "trace = 0" puis "trace = 1"
    - B a affiché "trace = 1" puis "trace = 2"

    Conclusion : juste avec les instructions de base tout s'est passé comme si le fait qu'une connexion MySQL accèdant a des données dans le cadre d'un script PHP verrouille par défaut ces données pour d'autres scripts, même en lecture.

    Ma question : est-ce que je me complique la vie a essayer de verrouiller des enregistrements pour rien, où est-ce que ce que je viens d'observer résulte de certaines options auxquelles je n'ai pas touchées?

    Ca m'intrigue, et surtout j'ai besoin d'être sûr d'obtenir toujours le même résultat.

    Merci.

Discussions similaires

  1. Verrouiller un enregistrement
    Par Pierre59 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/02/2007, 17h32
  2. Verrouiller un enregistrement
    Par touhami dans le forum InterBase
    Réponses: 5
    Dernier message: 15/03/2006, 11h59
  3. Verrouiller un enregistrement
    Par PAUL87 dans le forum Access
    Réponses: 32
    Dernier message: 10/12/2005, 23h15
  4. Verrouiller un enregistrement lors d'un select
    Par RamDevTeam dans le forum Bases de données
    Réponses: 5
    Dernier message: 01/11/2005, 17h20
  5. verrouiller un enregistrement - VBA/Access
    Par sebouratif dans le forum Access
    Réponses: 2
    Dernier message: 07/10/2005, 13h03

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