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

PHP & Base de données Discussion :

Empêcher les accès concurrents à un enregistrement MySQL


Sujet :

PHP & Base de données

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2002
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 314
    Points : 265
    Points
    265
    Par défaut Empêcher les accès concurrents à un enregistrement MySQL


    Je cherche un moyen simple d'empêcher la sélection d'un même enregistrement d'une table MySQL par deux services PHP à un instant T.

    Sachant que je ne veux bloquer que cet enregistrement et pas la table entière, auriez-vous quelque chose à me proposer ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Points : 1 177
    Points
    1 177
    Par défaut
    Si tu ne veux pas blocker la table, une solution pourrait etre d'avoir un champ 'lock' qui indique si l'entrée est libre ou non. Cela dit il faudra vraiment faire attention a libéré l'entrée sinon elle risque de rester bloquée.

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu peux gérer toi meme à travers colonnes/tables supplémentaires.
    Malheureusement le contexte web n'aide pas a connaitre la situation réel d'un utilisateur, par exemple s'il referme son navigateur la ligne reste en état verouillée.
    Il veut donc mieux prévoir une indication de la date de verrouillage.

  4. #4
    En attente de confirmation mail
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2002
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 314
    Points : 265
    Points
    265
    Par défaut
    Citation Envoyé par batataw Voir le message
    Si tu ne veux pas blocker la table, une solution pourrait etre d'avoir un champ 'lock' qui indique si l'entrée est libre ou non. Cela dit il faudra vraiment faire attention a libéré l'entrée sinon elle risque de rester bloquée.
    Oui j'y ai déjà pensé mais ça n'empêche pas vraiment qu'un enregistrement soit sélectionné par deux services PHP car je dois faire un SELECT pour récupérer mon ID d'enregistrement avant éventuellement de faire mon UPDATE comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE monenregistrement SET status="LOCKED" WHERE monID = 158 AND status="NOTLOCKED"
    Or je devrai dans ce cas tester le résultat de l'update pour savoir s'il est bien passé... (1 affected row ?)

    Tu peux gérer toi meme à travers colonnes/tables supplémentaires.
    Même combat... je pense que ça reste possible mais ce n'est pas très pratique.

    J'ai entendu parlé des mutex mais je ne vois pas trop comment appliquer ce principe...

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Quelle que soit la technique utilisée, la problématique est la meme : deux utilisateurs peuvent demander la meme ressource au meme moment et il faudra répondre a un des deux que finalement il ne pourra pas.

  6. #6
    En attente de confirmation mail
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2002
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 314
    Points : 265
    Points
    265
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Quelle que soit la technique utilisée, la problématique est la meme : deux utilisateurs peuvent demander la meme ressource au meme moment et il faudra répondre a un des deux que finalement il ne pourra pas.
    Oui mais je pensais qu'avec un système natif MySQL par exemple ça aurait pu mettre simplement en standby le deuxième service PHP. C'est à dire sans gérer de message d'erreur / sans rejeter la deuxième demande...

    Je n'ai peut-être pas le choix avec MySQL. Savez-vous quels sont les usages ?

    (En tout cas il me semble qu'avec d'autres SGBD on peut locker un enregistrement...)

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Points : 1 177
    Points
    1 177
    Par défaut
    Peux-tu décrire un peu plus ton projet, dans quel cas on ne doit pas avoir 2 acces simultanés? Peut-etre que la solution se trouve ailleurs.

  8. #8
    En attente de confirmation mail
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2002
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2002
    Messages : 314
    Points : 265
    Points
    265
    Par défaut
    Citation Envoyé par batataw Voir le message
    Peux-tu décrire un peu plus ton projet, dans quel cas on ne doit pas avoir 2 acces simultanés? Peut-etre que la solution se trouve ailleurs.
    Et bien par exemple donner un code de réduction d'un partenaire. Il est vrai que dans ce cas je pourrais faire un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $lockedID=456978ds7f
    update matabledecodes set locked="$lockedID" limit 1
    puis select * from matabledecodes where locked="$lockedID"

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Points : 1 177
    Points
    1 177
    Par défaut
    J'ai toujours pas compris la business logic de ton application, cependant tu pourrais peut-etre utiliser les procédures stockées si ta base le permet.
    Un truc du genre lock_entry_id() te retourne true si okay sinon false car déja lock.

Discussions similaires

  1. Réponses: 9
    Dernier message: 29/10/2008, 14h14
  2. Question sur les accés concurrents
    Par bannik dans le forum Autres
    Réponses: 1
    Dernier message: 08/02/2008, 17h41
  3. gérer les accès concurrents
    Par Nillak dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 06/01/2007, 13h05
  4. Réponses: 2
    Dernier message: 28/11/2005, 10h12
  5. Gérer les accès concurrents
    Par Royd938 dans le forum Langage
    Réponses: 1
    Dernier message: 19/10/2005, 11h27

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