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

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    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 éclairé

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Points : 671
    Points
    671
    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 régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    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 éclairé

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Points : 671
    Points
    671
    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 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    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 régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    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';
    	}

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Citation Envoyé par pas30
    c'est quoi une table ad hoc ???
    Une table que tu crées rien que pour ça.

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    Par défaut
    salut,

    j'ai bien compris ton principe je fais un insert into pointspeed values('')
    je récupère l'id inséré avec mysql_intert_id()
    ensuite je teste si ce numéro est égale à 10 mais mon problème c'est que je veux remettre à 0 la table si il gagne et donc il faudrait bloquer les autres joueurs pour qu'ils ne puissent pas jouer en même temps. On en revient au même problème qu'avant et j vois pas comment le contourner si ce n'est de passer en innodb mais je ne sais pas vraiment même si on dit beaucoup de bien des bases innodb.

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    tu ne remets rien à zéro du tout. Un joueur est gagnant s'il obtient une ID multiple de 10.

    Le système de l'autoincrément t'assure que même en situation de concurrence, il n'y aura jamais la même ID pour deux joueurs.

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    Par défaut
    ok donc il faut que je stocke tout alors.
    çà va créer une ligne par parties
    1
    2
    3
    4
    etc...
    mais à un moment donné faudra que je la vide quand meme car çà fera beaucoup de données.

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    Par défaut
    Tu ferais comment antoun tu ferais des insert into tables dans un champ autoincrement mais le problème qui reste c'est que je ne vais pas tout sauvergarder quand meme. Il faudra bien remettre à 0 à un moment car les champs autoincrement sont limités je crois et aussi car çà fera beaucoup de données à stocker.

  12. #12
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Citation Envoyé par pas30
    Tu ferais comment antoun tu ferais des insert into tables dans un champ autoincrement
    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into pointspeed(IDpartie) values(DEFAULT)
    Mais à ta place, je stockerais au minimum l'ID du joueur, et éventuellement un horodatage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    insert into pointspeed(IDjoueur, DateHeure) 
    values($IDjoueur, NOW())

    Citation Envoyé par pas30
    mais le problème qui reste c'est que je ne vais pas tout sauvergarder quand meme. Il faudra bien remettre à 0 à un moment car les champs autoincrement sont limités
    Si tu le mets en BIGINT UNSIGNED, tu as le droit d'aller jusqu'à 184 467 440 737 095, il me semble que ça te laisse une bonne marge

    Citation Envoyé par pas30
    je crois et aussi car çà fera beaucoup de données à stocker.
    Rien ne t'empêche de supprimer les vieilles données, en te basant soit sur l'horodatage, soit sur l'ID. Ça ne remet pas à zéro pour autant.

  13. #13
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    Par défaut
    Et quand j'arrive à 184 467 440 737 095 je fais quoi lol

  14. #14
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    quand tu seras à la moitié de ça, tu profites du premier arrêt technique pour faire un TRUNCATE et repartir à zéro (ou plutôt à un).

    Ceci dit... combien de parties par jour espères-tu au maximum ?

  15. #15
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    Par défaut
    un arrêt technique c'est quoi çà ???
    Sinon j'espère au moins 1000 parties par jour mais bon il y aura des lots différents genre une xbox, un chèque de 1000 euros donc je devrais créer une table pour chaque lot avec un compteur dans chaque table pour savoir combien de parties sont joué sur chaque lot.

  16. #16
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    Par défaut
    Citation Envoyé par pas30
    un arrêt technique c'est quoi çà ???
    version 1 : tu coupes ton site pour pouvoir faire des bidouilles dessus
    version 2 : ton hébergeur est dans les choux
    Citation Envoyé par pas30
    Sinon j'espère au moins 1000 parties par jour mais bon il y aura des lots différents genre une xbox, un chèque de 1000 euros donc je devrais créer une table pour chaque lot avec un compteur dans chaque table pour savoir combien de parties sont joué sur chaque lot.
    Bon, même à 1000 parties par jour, il te faudra 500 millions d'années pour atteindre la limite du BIGINT UNSIGNED... j'espère que tu es rassuré

    "A long terme, nous serons tous morts."
    John Maynard Keynes.

  17. #17
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    410
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 410
    Points : 90
    Points
    90
    Par défaut
    Pour couper mon site faut que j'insère ma fonction de mise en maintenance du site. C'est çà que tu voulais dire c'est mettre un message qui avertit que le site est en maintenance ou c'est virer tous les fichiers du serveurs et retransférer après (méthode pourrie lol). bon sinon je vais essayer çà mettre en big int unsigned çà devrait marcher très bien comme çà.

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