Bonjour,
j'ai plancher sur les transactions sur différents tuto et différent problème rencontré mais je ne trouve aucune solution pour mon problème et je n'arrive pas à le faire fonctionner correctement car j'utilise une tache cron.
Si j'ai bien compris le principe des transactions, si par exemple ma tache cron est en cours d'exécution et qu'une personne veut faire une opération sur cette même table en même temps que la tache sa demande va être placer dans la file d'attente et sera exécuter après, mais ce n'est pas le cas la requête est enregistré et quelques secondes plus tard elle reviens comme avant, je me tire les cheveux et j'essaye de comprendre mon erreur.
Ce qui est très embêtant c'est que si le client veux payer et renouveler son temps l'opération s'effectue avec succès lui dit ok votre temps maintenant est de *** et quelques secondes plus tard c'est comme si il avait pas payer et donc l'opération doit se faire manuellement.
Mon code transactions
Ma table est bien en innodb, et cet update n'est pas pris en compte lorsque ma tache cron s'exécute
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 try { $DB->beginTransaction(); $sql = "SELECT temps FROM tbl_serv WHERE id='$id' LIMIT 1"; $req = $DB->query($sql); $val = $req->fetch(PDO::FETCH_OBJ); $letemp = $val->temps; $tempsajouter = ($letemp+($temps*86400)); $res = $DB->query("UPDATE tbl_serv SET temps='$tempsajouter' WHERE id='$id'"); $DB->commit(); } catch(Exception $e) { $DB->rollback(); exit(); }
Ma tache cron:
Si ma transaction se fait au moment de la tache cron, elle devrait être placer en file d'attente et exécuter après non ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 function envoimail($mail) { j'envoi un mail } $sql = "SELECT id,temps,mail FROM tbl_serv LEFT JOIN tbl_conf ON tbl_serv.id=tbl_conf.id_sql"; $req = $DB->query($sql); while($val = $req->fetch(PDO::FETCH_OBJ)) { $temps = $val->temps; $temps = ($temps-600); //j'ai plusieurs conditions qui vérifie le temps if($temps < 84600) { envoimail(...); } $res = $DB->query("UPDATE tbl_serv SET temps='$tempsajouter' WHERE id='".$val->$id."'"); }
ici ca passe et quelques second après il y a comme un rollback le temps reviens comme il était avant la transactions est annuler.
Si quelqu'un peux me diriger ou voir quel erreur je fait car je ne comprend plus trop bien.
Merci pour vos conseille![]()
Partager