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 :

probleme d'accès à une table par plusieurs utilisateurs


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut probleme d'accès à une table par plusieurs utilisateurs
    Bonjour,

    J'ai un problème, j'ai une table qui contient une valeur qui peut etre modifier par tous les utilisateurs. Le problème c'est que entre un update et un select des requetes peuvent s'éxécuter et changer la valeur présent dans la table. Genre je fais une mise à jour d'un compteur en faisant update table set nb=nb+1 et derrière je fais un select. la valeur ne sera pas forcément celle que je viens de mettre à jour car une requete extérieur aura pu se glisser entre mon update et mon select. Dans mon cas, je dois identifier de manière unique chaque joueur pour faire gagner le xème joueur (exemple le 10 ème joueur). J'ai trouvé deux solutions :
    la première utiliser lock tables et delocker à la fin du traitement ou utiliser un champ autoincrement (le problème ici c'est que je voudrais en cas de gain remettre la table à 0 mais entre temps d'autres joueurs ont pu faire un update de ma table et donc je les supprimerrais et çà ne va pas.
    Je ne sais pas si je suis clair
    merci

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Par défaut
    Si tu es en MYISAM, les solutions coté base de données sont quasi inexistantes, tu seras obligé de gérer ces problèmes applicativement (donc beurk !! ).

    Si tu est en INNODB, logiquement, en utilisant des transactions, tu dois pouvoir t'en sortir puisque c'est la base des SGBDR de gérer la concurrence

    Tu définis ensuite un niveau d'isolation dont tu as besoin pour gérer ton business.
    1/ Read Commited ==> La nouvelle donnée en cours de mise à jour dans une transaction n'est pas lu par l'autre transaction, c'est l'ancienne valeur qui est récupéré dans le cache.
    ou
    2/ DIrty REAd ==> La nouvelle donnée en cours de mise à jour dans une transaction peu être lue par une autre transaction même si elle n'a pas encore été commitée.

    http://dev.mysql.com/books/mysqlpres...rial/ch10.html

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut
    je suis en myisam çà doit etre par défaut chez free enfin je ne sais pas.
    Donc d'après toi il suffirait de passer ma base en innodb (c'est gratuit ?) pour pouvoir gérer mon jeu d'instant gagnant c'est à dire faire un script qui donnera une valeur unique à chaque joueur.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Par défaut
    je sais pas si on peut chez free, à voir...

    En utilisant les transactions, tant que la valeur sera pas commitée, les autres ne pourront pas la mettre à jour mais pourront la lire (ancienne valeur vue) si option READ COMMITED.
    Ca te permettra de gérer la concurrence d'accès sur ta donnée sensible.

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    il y a bcp + simple : utilise un auto-incrément, au besoin en créant une table ad hoc.

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2006
    Messages
    411
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 411
    Par défaut
    c'est quoi une table ad hoc ???
    Sinon voilà mon code concrètement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	$query="update pointspeed set nombre=nombre+1";
    	$result = mysql_query($query, $connection) or die('error making query');
    	$query2="select * from pointspeed";
    	$result2 = mysql_query($query, $connection) or die('error making query');
    	$data2=mysql_fetch_array($result2);
    	if ($data2[nombre]==10) {
    		echo 'gagne';
    		$query3="update pointspeed set nombre=0";
    		$result3 = mysql_query($query3, $connection) or die('error making query');
    	}
    	else {
    		echo 'perdu';
    	}

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/03/2012, 21h35
  2. [MySQL] Alimenter une table par plusieurs formulaires et remplacer les valeurs existantes
    Par deshogues dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/03/2009, 17h49
  3. Autorisation d'accès à une table par VBA
    Par electrosat03 dans le forum Access
    Réponses: 4
    Dernier message: 30/01/2007, 17h55
  4. Réponses: 7
    Dernier message: 12/07/2006, 17h34
  5. [POSTGRESQL - C#] Probleme d'accès à une table
    Par angusyoung34 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 31/12/2005, 13h33

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