JeuWeb - Crée ton jeu par navigateur
Transactions qui s'annule - 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 : Transactions qui s'annule (/showthread.php?tid=5153)

Pages : 1 2 3 4


Transactions qui s'annule - watibou - 05-09-2010

Bonjour,

Je post mon problème ici que je n'arrive pas à le résoudre depuis quelque jours et en cherchant sur google j'ai découvert ce forum qui correspond exactement à ce que je fait.

J'ai une tache cron qui s'exécute une fois par jours et vérifie le temps restant de chaque joueurs, chaque joueurs reçoit une semaine d'utilisation par paiement, la tache cron décompte le temps chaque jours ce qui permet d'envoyer une alerte par mail si le temps arrive à échéance 3 jour, 2 jours etc.

- imaginons l'exécution de cette tache cron
- un joueurs fait un paiement pour renouveler son temps au même moment

le paiement est accepter la bdd se met bien à jours et quelques secondes plus tard lorsque la tache cron est terminé le temps est revenu comme avant.

j'ai vraiment plancher sur la doc mysql concernant les transactions mais c'est vraiment à devenir fou ^^ je n'arrive pas a comprendre pourquoi ma transactions ne se place pas dans une file d'attente et procède à la modification après la tache cron.

voici ma transactions
Code PHP :
<?php 
$BDD
->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
$BDD->beginTransaction();
$res = $DB->query("UPDATE tbl_gamer SET temps='$tempsajouter' WHERE gamer='$gamer'");
$BDD->commit();

Pour ma tache cron je fait un simple select id je récupère les champs temps je fait quelque conditions qui vérifie si le temps est plus que < 86400 par exemples si oui je lance une fonction qui envoi un mail au joueurs, mes table sont bien en INNODB .

Si vraiment quelqu'un pourrait me diriger vers une soluce ce serait vraiment cool.

Merci .


RE: Transactions qui s'annule - gameprog2 - 05-09-2010

Pourquoi ne ferait-tu pas faire simplement à la tâche Cron un test sur un fichier pour savoir d'abord si le paiement a été effectué ou pas ? la tâche Cron sachant cela peut ainsi décider si elle envoie le mail ou pas Wink
Le fichier est simplement mis à jour par un code php chaque fois qu'un paiement est fait par le joueur Wink

Bien sûr quand je dis le Cron fait ceci ou fait cela, je parle d'une fonction exécutée par le Cron Wink


RE: Transactions qui s'annule - watibou - 05-09-2010

Merci gameprog2 ,

je pense que tu veux parler de flag, c'est une idée que j'ai déjà tester mais j'ai été confronter à un autre problème car si le joueur pour une raison ou une autre décide de payer 2 fois de suite avec ses points, son temps sera pris en compte qu'une seul fois, donc même souci, je voudrait vraiment que les transactions se place dans une file d'attente ce qui devrait en principe être le cas et quoi qu'il arrive la tache cron ou le paiements soit absolument passer sans erreurs ce qui devrait être la fonction des transactions ou alors j'ai louper un truc ^^

Merci Smile


RE: Transactions qui s'annule - php_addict - 05-09-2010

une transaction sert uniquement à s'assurer que toutes les requetes n'ont pas plantées avant de valider et de mettre à jour la base de donnée

pseudo code
Code :
try
{
beginTransaction();

// ta requete
// ton autre requete
// ta requete qui plante


commit();
}
catch(PDOException $e)
{
$bdd->rollBack();
}

en gros quand ta requete plante tu fais un rollback pour annuler...

euh je sais pas si c'est clair...
et ben dans ta transaction tu test si le joueur a déjà payé...(une entrée payé=1 sur la table joueur) non ? comme ca ta transaction n'est pas validée


RE: Transactions qui s'annule - watibou - 05-09-2010

Salut php_addict,

Oui c'est très clair pour moi je connait le principe des transactions ce que je ne comprend pas c'est pourquoi il accepte la transactions et quelques secondes plus tard tout est annulée, car je n'ai aucun rollback qui s'effectue après la transactions elle est considérer accomplie aucune erreur coter transactions mais bizarrement elle s'annule quelques secondes plus tard.

je n'ai pas mit le code entier mais j'utilise bien le try catch pour mes verif, et si j'ai une erreur alors rollback + message, le prob c'est que j'ai pas d'erreur Smile
Je met mon code un peu plus complet

Code PHP :
<?php 
try
{
$DB->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
$DB->beginTransaction();


$sql = "SELECT gamer,temps,mail FROM tbl_gamer WHERE id='$id_sql'";
$req = $DB->query($sql);
$val = $req->fetch(PDO::FETCH_OBJ);
$DB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$letemp = $val->temps;
$tempsajouter = ($letemp+($temps*86400));

$res = $DB->query("UPDATE tbl_gamer SET temps='$tempsajouter' WHERE gamer='".$val->gamer."'");

$DB->commit();
}
catch(
Exception $e) //en cas d'erreur
{
// alerte popup jquery ui
alerte_erreur();
exit();
}

Voila ce que je voudrait c'est que cette transactions soit placer en file d'attente et passe quoi qu'il arrive, je pense que c'est le but des transactions et que si une tache est en cours elle attends et s'exécute juste après, maintenant si ça ne passe pas d'après la doc mysql c'est qu'il y a eu un plantage serveur ou autres ici le commit passe et ensuite reviens en arrière.

Pour ma tache cron c'est un simple update de toutes la table qui retirer 84600 secondes tous les jours.

Un grand merci pour votre aide Smile


RE: Transactions qui s'annule - php_addict - 05-09-2010

(05-09-2010, 10:15 AM)watibou a écrit : Voila ce que je voudrait c'est que cette transactions soit placer en file d'attente et passe quoi qu'il arrive, je pense que c'est le but des transactions et que si une tache est en cours elle attends et s'exécute juste après

ah ba non, ce n'est pas le but d'une transaction, comme je l'ai dis une transaction sert à faire des requetes au sein meme de la transaction et si ca se passe mal on revient en arriere...

effectivement les transactions peuvent s'empiler dans la file d'attente si il y en a plusieurs lancées quasi au meme moment, mais tu ne peut pas lancer une transaction qui devra s'executer dans 1 heure, si tu lance ta transaction elle sera executée immediatement et pas dans 1 heure.

une transaction n'est pas un tache CRON (ou AT sur windows)

si tu as besoin de lancer un script toute les 2 heures, utilise une tache cron, pas une transaction...

par contre si tu peut te passer des taches cron c'est mieux pour le serveur, certains voudrais par exemple utiliser une tache cron pour mettre à jour les ressources des joueurs (ressources comme dans travian par exemple, bois terre fer blé) alors que dans ce cas precis la tache cron est à éviter à tout prix...

ais je été clair? mais peut etre me trompes-je ?


RE: Transactions qui s'annule - srm - 05-09-2010

Je ne vais pas répondre à ta question mais quand même te donner la solution.
Tu crois que Wow va mettre à jour tous les jours des dizaines/centaines de millions de ligne pour savoir combien de temps il leur reste à jouer ?
Non.

Au lieu de faire comme ça tu dois plutôt stocker la date limite jusqu'à laquelle il peut jouer et quand il se connecte tu comptes le nombre de jour restant entre aujourd'hui et la date limite de son abonnement.


RE: Transactions qui s'annule - watibou - 05-09-2010

Merci pour vos réponses,

C'est peux être mois qui n'ai pas été clair et j'en suis désolé, ma tache cron est importante car la personne ne va pas se connecter uniquement pour vérifier son temps si il expirer ou pas, si la personne ne renouvelle pas alors son compte est suspendu, le but est justement de lui annoncer que son temps arrive à échéance et qu'il doit se connecter pour le renouveler.

Je ne demande pas mieux qu'il exécute la transactions immédiatement après c'est d'ailleurs ce que je cherche à faire et pas faire une transactions qui s'exécute dans 1 heures ce n'est pas du tout le but, je veux justement quel s'empile, mais elle ne s'empile pas elle s'annule tous simplement.

Pour le cron c'est un simple update de la table
La transactions passe devant, ou après la tache cron mais elle doit passer, même si c'est après la tache cron.

je ne sais pas si je suis clair dans ce que je dit mais au final quoi qu'il arrive ma transactions doit passer et c'est bien la le problème elle passe puis reviens en arrière a mon avis parce que la table est locker par le cron.

Sur ma tache cron je ne fait aucune transactions et je ne pense pas avoir dit le contraire.

Au début je n'avait pas énormément de joueurs et donc tout passait sans problème jusqu'au jours ou arriver à 50000 les joueurs commençait à se plaindre qu'il payait et les jours ne s'ajoutait pas correctement, donc j'ai placer une conditions qui pour l'instant fonctionne très bien j'ai mes tables en myisam et si la page met plus de 10 secondes à répondre alors messages d'erreurs et rien ne se passe puisque bloquer par le cron, ils essayent à nouveau et ca fonctionne.

Oxman si je pouvait faire autrement je le ferait mais le contexte n'est absolument pas le même et ma tache cron est importante car comment avertir que le délai va expirer sans tache cron ?

Mon but est maintenant de ne plus afficher de messages d'erreurs et que la requête passe correctement à chaque fois.

Merci à vous


RE: Transactions qui s'annule - srm - 05-09-2010

Tu ne changes pas le système que je t'ai dit.
Sauf que maintenant dans ta tâche cron tu vas juste vérifier combien de jour il lui reste et lui envoyer un mail pour l'avertir.
Et si son compte est arrivé à expiration tu mets un flag pour dire qu'il est suspendu.

Pas besoin de transaction pour ça.


RE: Transactions qui s'annule - php_addict - 05-09-2010

(05-09-2010, 12:23 PM)watibou a écrit : Oxman si je pouvait faire autrement je le ferait mais le contexte n'est absolument pas le même et ma tache cron est importante car comment avertir que le délai va expirer sans tache cron ?

sur toutes tes pages, tu lances un script qui verifie si il y a des joueurs dont la date a expiré, et ce peut importe quel joueur affiche une des pages de ton site.

en gros si le joueur A joue et est connecté il lance le script qui vérifie quels sont les joueurs expirés (joueur B par exmpl)... En plus si tu as autant de joueurs cette solution est viable non ?