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 :

Demande précisions sur LOCK TABLE [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut Demande précisions sur LOCK TABLE
    Bonjour à tous,

    D'un côté des requêtes INSERT dans 2 tables. (par les clients)
    De l'autre, des requêtes UPDATE sur les mêmes tables. (par les admin)

    Il y a des risques de conflit. Je souhaiterais utiliser LOCK TABLE et j'ai lu la doc MySQL sur le propos - doc d'une clarté limpide, comme d'habitude mais je ne voudrais pas faire d'âneries.

    Je vous pose donc ces questions :

    - Faut il faire LOCK WRITE / UNLOCK sur les requêtes des 2 côtés ? Ou un seul suffit ?
    - Ou alors des 2 côtés mais en définissant des priorités ?
    - Si il faut le faire que d'un côté, lequel ? celui qui INSERT ou celui qui UPDATE ?

    Bref je veux bien quelques précisions sur le sujet.
    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Vu que les requêtes sur une même table sont exécutées séquentiellement, on n'a généralement pas besoin d'utiliser les lock. Il faudrait que tu nous en dise un peu plus sur ton schéma producteur / consommateur pour qu'on te réponde clairement.

  3. #3
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour et merci de me répondre,

    Oui, il s'agit de la gestion d'une boutique qui tourne assez bien : il y a la table "commandes" - qui enregistre un résumé de commande puis génère un commande_id, et "commande_details" qui enregistre autant de lignes qu'il y a de produits commandés, avec prix, quantités...etc. Elle a bien sûr un champ "commande_id" qui permet ensuite de lier les requêtes select.

    Chaque fois qu'un client enregistre une commande, toutes les 10mn, on va dire, on écrit en insert dans ces deux tables.

    Mais côté admin, 2 personnes écrivent aussi dans ces 2 tables, en update, toutes les 10 mn, on va dire aussi, puisqu'elles génèrent des factures et valident les quantités livrées par rapport aux quantités commandées.

    Et j'ai remarqué, parfois, des erreurs d'update (côté admin, donc) incompréhensibles et impossibles à reproduire, des trucs farfelus. Ca se produit parfois 1 fois par jour, parfois 1 fois tous les 2 jours...c'est complètement aléatoire.

    Alors, je me suis dit qu'il y avait peut-être conflit, et, de façon à éliminer cette piste, j'ai pensé aux verrous...

    Voili-voilou...

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    C'est à creuser...

    Imaginons le scénario suivant
    - L'utilisateur A enregistre la commande CA
    - L'admin B modifie la commande CA
    - Au même moment L'utilisateur A consulte et modifie sa commande CA
    - L'admin B valide la commande CA

    L'une des modification devra (lock ou non) être affecté avant l'autre, si j'étais toi je chercherai s'il n'y a pas une erreur de logique quelque part, normalement, le dernier utilisateur ou administrateur à "parler" à la base devrait écraser les modifications précédentes... Donc et à moins que tu n'aies mis un mécanisme de cache, tout devrait se passer normalement.

  5. #5
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    En fait, j'ai omis de préciser que c'est dans la table "commande_details" que se produisent les loups. Celle des commandes n'enregistre qu'une ligne par commande, et n'est updatée que d'un champ côté admin. Donc, si conflit il y a, c'est plus rare.

    Par contre, dans "commande_details" :

    L'utilisateur A passe une commande de mettons 10 produits.
    La boucle parcoure le caddie et enregistre 10 lignes dans la table.
    ....
    En même temps, l'admin X update la même table, mais forcément un autre commande_id, sur une commande qui fait aussi, admettons, 10 lignes.

    Ca peut pas se parasiter, dans ce cas ?
    Et, non, pas de système de cache ici.

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ah oui effectivement, je comprends mieux. Je pense en effet que tu as besoin des locks des deux cotés:
    - L'utilisateur doit attendre que l'admin ait fini d'opérer sur sa commande
    - L'admin doit attendre que l'utilisateur ait fini de compléter sa commande pour la modifier
    A mon avis il faut le faire des deux cotés car que se passerait-il si par exemple tu donnais plus de priorité à l'utilisateur et qu'il édite sa commande pendant que l'admin fait la même chose ?

    Il y a deux écoles: soit tu attends que le lock soit levé (avec un slip propre ) soit tu affiche un message d'erreur indiquant que la commande est en cours de traitement par un autre processus.

  7. #7
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Ben c'est toute ma question, justement

    Je dirais que le client est prioritaire sur l'admin (ne serait-ce que parce que sans client, l'admin, ben il a pas de taf ) et donc je pensais LOCK / UNLOCK uniquement côté public, en me disant que l'admin, pour son UPDATE, devra attendre que le client ait fini et que les tables soient UNLOCK.

    Non ?

    Parce que à ce stade, le client il édite rien, il update pas. Ses données s'insèrent en table et c'est fini.

    [EDIT]
    tu affiche un message d'erreur indiquant que la commande est en cours de traitement par un autre processus
    Ah ? ET comment on fait ça ? Comment on sait, côté admin, qu'une commande client est en train de s'insérer ?
    Ca m'intéresse bigrement, parce que tu imagines...2 admins !

  8. #8
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    En te servant de GET_LOCK peut être

    Non ?
    Non. A mon avis, il faut poser le lock des deux coté pour éviter qu'un utilisateur ne parasite le travail d'un admin. De toute façon, si tes requêtes sont suffisament optimisées, l'attente de la levée du lock ne devrait pas être longue et comme tu l'as dit toi même, les collisions sont peu nombreuses, l'impact coté client est pratiquement nul.

  9. #9
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Humm, je n'ai pas capté grand chose à GET_LOCK, mais tant pis.
    Décidément, cette doc Mysql...est vraiment, euh...ésotérique.

    J'ai suivi ton conseil, et mis un verrou des deux côtés.
    On va bien voir.
    Je te remercie bien pour ton aide.
    Bonne fin de journée.

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 26/08/2011, 22h02
  2. [C++] Demande précision sur Pattern Factory
    Par Aspic dans le forum C++
    Réponses: 36
    Dernier message: 25/08/2011, 12h40
  3. Demande de précision sur "Extends" ..
    Par Invité dans le forum Langage
    Réponses: 6
    Dernier message: 12/02/2006, 14h25
  4. Demande de précisions sur Backup/Restore et transactions
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 16/11/2005, 12h08
  5. Faire un Lock sur une table pendant l'exec d'un DTS
    Par Pete dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/03/2005, 14h17

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