Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sql bloque pendant un update

    1 septembre 2010 à 10:06:04

    Bonjour,

    J'ai un petit problème sur une base de donnée.
    J'ai une tache cron qui s'exécute toutes les 5 minutes, cette tache met à jour la base donnée avec un update et retire 5 minutes dans le champs temps et ce toutes les 5 minutes.
    Pendant cette tache lorsque je tente de faire une opération sql ma table est bloquer par le cron, je cherche une solution pour que cette tache puisse continuer et que le reste du site puisse fonctionner, je pensait mettre une autre base de données en route avec une table en parallèles qui ferait les opérations du site et qui ne bloquerais pas pendant le cron, mais quoi qu'il arrive je doit mettre la table principale à jours et le problème reviens au même au moment ou je devrait la mettre à jours tout va bloquer.

    Exemple table principale:

    id = 1
    temps = 86400
    nom = moi
    image = image.jpg
    


    lorsque cron décompte 300 secondes il bloque tous le reste, si je veux par exemple changer d'image et qu'une tache cron est en cours impossible la requête échoue en sachant qu'il y à 50000 entrées sur cette table.

    Au début je n'avait aucun problèmes car la table était légère mais au file du temps la tables augmente et je rencontre ce genre de problèmes.

    Je ne demande pas que l'on fasse quoi que ce soit pour moi, mais simplement une aide stratégique pour contourner ce problème.

    Merci à ceux qui ont des idées à me soumettre.
    • Partager sur Facebook
    • Partager sur Twitter
      1 septembre 2010 à 10:58:06

      Le cron est vraiment utile pour ce que tu en fais ?
      D'après ce que je vois ta table représente un membre non ? Qui doit donc s'identifier. Il suffirait alors d'un calcul avec la date de dernière connexion pour mettre à jour le temps.

      Dans le cas contraire il doit falloir jouer avec les verrous mais je n'y connais pas grand chose, je ne sais même pas si c'est possible.
      • Partager sur Facebook
      • Partager sur Twitter
      Ce n'est pas parce que vous ne savez pas vous servir d'un marteau qu'il faut planter des clous au tournevis.
        1 septembre 2010 à 11:17:31

        le cron est vraiment important car il est comme un loyer, les gens après leur paiement augmente leur temps et ils peuvent contrôler eu même les temps restant de leur propre client de sous location c'est un peu complexe à comprendre .

        Pour contourner le problème provisoirement j'ai fait une détection du temps d'exécution et si la page met plus de 3 secondes alors j'annule la requêtes et j'affiche un message veuillez réessayer plus tard.

        Je parlait d'image mais en faite c'est plutôt lorsque le client paye et qu'une tache est en cours alors le temps ajouter après le paiements ne met pas la table à jours à cause du cron vraiment comme si la table était figer et n'accepte rien d'autres.

        Merci nightmat
        • Partager sur Facebook
        • Partager sur Twitter
          1 septembre 2010 à 11:23:04

          Mouais je comprends pas grand chose ^^'
          Cette page pourrait t'intéresser : http://dev.mysql.com/doc/refman/5.0/fr/table-locking.html
          • Partager sur Facebook
          • Partager sur Twitter
          Ce n'est pas parce que vous ne savez pas vous servir d'un marteau qu'il faut planter des clous au tournevis.
            3 septembre 2010 à 10:06:40

            Bonjour,

            j'ai plancher sur les transactions pour mon problème mais je n'arrive pas à le faire fonctionner correctement.

            Mon code transactions
            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 table est bien en innodb, et cet update n'est pas pris en compte lorsque ma tache cron s'exécute

            Ma tache cron:
            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."'");
            }
            


            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 ?
            ici ca passe et quelques second après il y a comme un rollback le temps reviens comme il était avant la transactions et annule.

            Si quelqu'un peux me diriger ou voir quel erreur je fait car je ne comprend plus trop bien.

            Merci :)
            • Partager sur Facebook
            • Partager sur Twitter
              5 septembre 2010 à 7:24:12

              un petit up , le problème est il si flagrant?
              • Partager sur Facebook
              • Partager sur Twitter

              Sql bloque pendant un update

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown