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 :

Accès concurrents PHP MySQL


Sujet :

Requêtes MySQL

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut Accès concurrents PHP MySQL
    Bonjour,

    j'ai une question concernant 2 pages php qui modifie la même valeur dans une table MySQL

    dans la première page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT stock FROM table WHERE id=1
    //puis un peu plus loin
    UPDATE table SET stock=$stock WHERE id=1
    dans la seconde page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT position, stock FROM table WHERE id=1
    //puis un peu plus loin
    UPDATE table SET stock=$stock WHERE id=1
    étant donné que php exécute le script de façon syncrone si la page 1 est lancée en premier, attend-il la fin de l'exécution de la page1 avant de lancer la page2, y a-t-il un risque d'accès concurrents sur stock ?

    merci

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Oui, si vous ne gérez pas de transaction avec un niveau d'isolation adéquat, vous risquez fort de ne pas obtenir le résultat escompté. La page 2 n'attendra pas le a fin de la page 1 avant de démarrer, car la page 1 n'aura pas posé de verrou sur les données.

    Scénario classique dans votre cas (si par exemple chaque page est censée décrémenter le stock de 1) :

    1- la page1 récupère le stock (disons : 9)
    2- la page2 récupère le stock (donc toujours 9, la page 1 n'a pas encore effectué la mise à jour)
    3 - la page 1 met le stock à jour --> 9- 1 = 8
    4 - la page 2 mets à jour le stock --> 9- 1 = 8

    Au final, le stock aura diminué de 1 au lieu de 2 !

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    alors même si c'est la même page lancé par 2 utilisateurs différents ?

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    oui

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    1- la page1 récupère le stock (disons : 9)
    2- la page2 récupère le stock (donc toujours 9, la page 1 n'a pas encore effectué la mise à jour)
    3 - la page 1 met le stock à jour --> 9- 1 = 8
    4 - la page 2 mets à jour le stock --> 9- 1 = 8
    Tout dépend des requêtes effectuées dans la procédure.

    car 1 et 2 peuvent être en //, mais 4 attendra la fin de 3.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    car 1 et 2 peuvent être en //, mais 4 attendra la fin de 3.
    Certes mais le résultat sera le même : le stock ne sera pas bon au final.
    et peu importe que 1 et 2 soient en parallèle ou pas : il suffit qu'il aient lieux tous les deux avant 3.

    (j'ai supposé que $stock provenait d'un calcul effectué à partir des données de stock récupérée en début de page)

    pol2095 ne dit pas ce que font les pages php, mais il y a fort à parier qu'elles pourraient être remplacées par une seule requete UPDATE.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Certes mais le résultat sera le même : le stock ne sera pas bon au final.
    et peu importe que 1 et 2 soient en parallèle ou pas : il suffit qu'il aient lieux tous les deux avant 3.

    (j'ai supposé que $stock provenait d'un calcul effectué à partir des données de stock récupérée en début de page)

    pol2095 ne dit pas ce que font les pages php, mais il y a fort à parier qu'elles pourraient être remplacées par une seule requete UPDATE.
    NON !!!!!

    Encore une fois tout dépend des requêtes effectuées !

    Démo :
    étape 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -- vérification de l'état du stock pour retirer une quantité donné @nombre
    SELECT @nombre
    FROM   STOCK
    WHERE  ETAT >= @nombre;
    --> si pas de réponse, traitement terminé retrait impossible
    étape 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    --> mise à jour du stock si réponse :
    UPDATE STOCK
    SET    ETAT = ETAT - @nombre
    WHERE  ETAT - @nombre >= 0;
    --> si pas de ligne mise à jour, alors traitement terminé, retrait impossible
    D'ailleurs une seule étape est suffisante en matière de gestion des stock. L'étape 2 !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    Par défaut
    c'était un exemple, bien sûr c'est beaucoup plus complexe, dans le doute je vais mettre un commit, comme ça aucun soucis.

Discussions similaires

  1. PHP & MySQL : accès concurrent
    Par gloubi dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 09/07/2009, 14h30
  2. Réponses: 9
    Dernier message: 29/10/2008, 14h14
  3. Nombre d'accès concurrent à un script php
    Par canabral dans le forum Langage
    Réponses: 2
    Dernier message: 13/10/2008, 16h45
  4. [MySQL] Accès concurrent PHP
    Par ThunderBolt_ dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/06/2008, 20h34
  5. jsp mysql accès concurrents aux données
    Par elpeygey dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 26/04/2007, 14h03

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