JeuWeb - Crée ton jeu par navigateur
[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 :
<?php 
mysql_query
('START TRANSACTION');
mysql_query($firstQuery);
mysql_query($secondQuery);
// Etc.
mysql_query('COMMIT');

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é