[Résolu] Requêtes simultanées - Version imprimable +- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org) +-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38) +--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51) +--- Sujet : [Résolu] Requêtes simultanées (/showthread.php?tid=3267) |
[Résolu] Requêtes simultanées - SirGalahaad - 09-11-2008 bonjour à tous ! j'ai un soucis (qui arrive très rarement, mais qui est très génant) sur mon jeu, je vais vous donner un exemple concret : joueur A et joueur B tapent joueur C en même temps le jeu effectue une requête pour chaque joueur pour récupérer les infos requises et notament la vie restante du joueur C, mettons 200points de vie, comme les requêtes sont quasiment simultannées, A et B récupèrent tous les deux la même information : C a 200 en vie ensuite, A fait 150points de dégâts et B fait 250points de dégâts, mais malheureusement l'attaque étant simultannée, quand les deux scripts font leur update une fraction de seconde plus tard, il peut se passer la chose suivante : B passe en premier, mettant C à -50points de vie (et son écran lui indique qu'il l'a tué) puis A update la base en mettant C à 50points de vie, et celui-ci est donc toujours en vie... bien sur je n'ai pas réussi à reproduire la situation, mais je l'ai déduit par rapport à certaines choses qui se sont passées, et pour lesquelles je ne vois pas d'autres explications quelqu'un sait comment gérer ce problème? RE: Requêtes Simultannées - Sephi-Chan - 09-11-2008 Walai, Il faut que tu utilisent les transactions. Elles sont décrites dans la documentation MySQL - Commandes relatives aux verrous et aux transactions. Elles permettent de garantir que rien n'a changé dans la table du début jusqu'à la fin de la transaction. Pour les utiliser, il faut que les tables qui vont êtres impliquées dans les transactions utilisent le moteur de stockage InnoDB (à la place de MyISAM, généralement). Ensuite, c'est simple, il te suffit de faire une requête qui indique un début de transaction. Code PHP :
Voilà pour l'utilisation basique. Pour le reste, je t'invite à consulter la documentation. Sephi-Chan RE: Requêtes Simultannées - SirGalahaad - 09-11-2008 merci beaucoup ! RE: [Résolu] Requêtes simultanées - keke - 09-11-2008 Sinon, tu peux utiliser des requêtes : update perso set pdv = pdv - 150 where id_perso = 'le joueur qui s'en prend plein la tronche' Ainsi si ton perso se chope 2 fois une attaque, quelle que soit l'ordre, il perd des points de vie. Par contre méfie toi des petits malins qui utiliserais la fonction F5. Sinon la technique de Sephi est bien adapté aussi ^^ kéké |