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 habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    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
    Points : 13 092
    Points
    13 092
    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 habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    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
    Points : 13 092
    Points
    13 092
    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 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    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
    Points : 13 092
    Points
    13 092
    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 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    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 habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    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