Partage
  • Partager sur Facebook
  • Partager sur Twitter

LOCK TABLE

    2 novembre 2010 à 14:41:12

    bonjour

    je me bats avec les LOCK TABLE et j'ai besion d'aide. Je voudrais savoir si un table est effectivement verrouillée. A la base je me suis dit je fait confiance a la commande LOCK TABLES, je décortique la doc, et tout avait l'air de bien marcher.

    J'ai donc fait un test avec le code suivant (je vous passe les details de connection):

    <?php
    $Query1 = ' SELECT *
                FROM table1
                WHERE manager = 10';
    $Result1 = $DbConnection->query($Query1);
    
    while($Player = mysql_fetch_array($Result1))
    {
         echo (" =". $Player['pseudo'] ."<br  />");
    }
    
    $QueryLock = 'LOCK TABLES table1 WRITE';
    $ResultLock = $DbConnection->query($QueryLock);
    
        echo "wait";
        sleep(20);
        echo "fin";
    
    $QueryUnlock = 'UNLOCK TABLES';
    $ResultUnlock = $DbConnection->query($QueryUnlock);
    
    ?>
    


    en clair, je test si il y a des datas, je les affiche, je lock la table pendant 20 secondes puis je la libere.

    Ensuite j'ai un autre code juste pour tester l'acces a la table

    <?php
    $Query1 = ' SELECT *
                FROM table1
                WHERE manager = 10';
    $Result1 = $DbConnection->query($Query1);
    
    while($Player = mysql_fetch_array($Result1))
    {
         echo (" =". $Player['pseudo'] ."<br  />");
    }
    ?>
    


    je lance le premier code dans un navigateur, il met 20 second pour s'executer, jusque la normal.
    puis sur un autre machine je lance le second code....je m'attandais a devoir patienter 18- 20 secondes pour avec le retour...et en fait pas du tout, c'est immediate, et le second code se terminer avant le premier

    Ou ai je commis la boulette? ca veut dire que le lock en ecriture n'interdit pas la lecture...or la doc dit le contraire....je suis perdu.

    Merci de votre aide


    • Partager sur Facebook
    • Partager sur Twitter
      2 novembre 2010 à 14:44:10

      Pourquoi as-tu besoin de verrouiller les tables ?
      • Partager sur Facebook
      • Partager sur Twitter
        2 novembre 2010 à 14:55:14

        :) bonne question.
        parce que la table que je verouille est lu par plusieurs process , traité suivant le contenu, puis un flag est mise a jour comme record traité.
        Au debut je ne le faisais pas et je me suis rendu compte que des données dans une autre table etaient a double....ce qui voulait dire que 2 process on reussit a lire le meme record dans un temps tres court avant que le premier ai eu le temp de flager le dit record.

        Je precise que je suis en MyISAM
        • Partager sur Facebook
        • Partager sur Twitter
          2 novembre 2010 à 15:00:41

          Tu n'as pas envie d'utiliser SELECT FOR UPDATE ? (ça ne fonctionne qu'en innodb, mais ce n'est pas très compliqué de changer !)

          > 2 process on reussit a lire le meme record dans un temps tres
          > court avant que le premier ai eu le temp de flager le dit record.

          Sinon, une manière plus simple :

          - tu mets un champ genre "pid" dans ta table qui indique quel process est en train de traiter cette ligne
          - tu fais UPDATE table SET pid=monpid WHERE pid IS NULL LIMIT 1

          et voilà, tu as réservé une ligne.

          Ou tu garde ton code, mais tu changes ton UPDATE par un UPDATE .. SET locked=1 WHERE ... AND locked=0

          Si aucune ligne n'est updatée, cela veut dire qu'un autre process l'a déjà fait.
          • Partager sur Facebook
          • Partager sur Twitter
            2 novembre 2010 à 16:40:47

            utilise flock (système de fichier), le lockage de table ne fonctionne pas comme tu le penses.

            Tracker.
            • Partager sur Facebook
            • Partager sur Twitter
              2 novembre 2010 à 18:52:56

              Merci pour vos reponses...tres apprecié!!

              Tracker, peux tu m'en dire plus la ou je me trompe ... si le lockage de table ne fonctionne pas comme je le pense, je dois repercuter une correction sur plusieurs endroit. Merci de m'aiguiller
              • Partager sur Facebook
              • Partager sur Twitter
                2 novembre 2010 à 18:57:04

                Le LOCK TABLES de MySQL fonctionne très bien, mais il est à peu près incompréhensible. Ce que tu veux faire ne nécessite pas de lock manuel (et surtout pas de flock) puisqu'une seule requête suffit.

                Explique la structure de ta table.
                • Partager sur Facebook
                • Partager sur Twitter
                  2 novembre 2010 à 19:02:03

                  bonjour,
                  FLOCK, FLOP.
                  Le verrouillage de fichiers pour verrouiller une table ou un enregistrement!!!
                  Faut arrêter!
                  Oublie Tracker, relis Lord Casque Noir!
                  Selon les SGBDR il y a 4 niveaux de verrouillage - gérés par le SGBDR, pas par l'adm système (qui n'a rien à voir ici), - (BD, TABLE, enregistrement, champ).
                  Le verrouillage de BD est utilisé par un ADM pas par un développeur ...


                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 novembre 2010 à 8:36:43

                    Pourquoi tu n'utilise pas plutot des transactions ?..
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 novembre 2010 à 12:11:14

                      J'ai bien peur que les posteurs n'aient pas compris que tu utilisais MyISAM, ce qui entraine:
                      > pas de transactions
                      >> pas de select for update / in share mode

                      Donc seul lock table ou flock restent dispos, les deux méthodes restent equivalentes en lecture sachant que tu dois locker explicitement avant de lire...
                      flock évite un accès au sgbd mais n'interdirait pas un autre process qui viendrait modifier les données, à toi de savoir ce que tu recherches.

                      Tracker.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 novembre 2010 à 12:20:48

                        Virer MyISAM serait la première chose raisonnable à faire...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 novembre 2010 à 15:53:25

                          Citation : Lord Casque Noir

                          Virer MyISAM serait la première chose raisonnable à faire...


                          Je confirme, cet engine ne sert a rien a part causer des problèmes...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 novembre 2010 à 18:49:31

                            Alors apres avoir fait des tests dans tous les sens, lu et relu la doc, la réponse a ma propre question est :

                            la raison pour laquelle le second code décrit plus haut est capable d'aller lire une table pendant que la table a un LOCK WRITE fait par le premier code est que les SELECT vont en fait lire les données en cache si une requete identique a deja ete genere.

                            En fait le premier code et le second utilisent le même SELECT donc le résultat est dans le cache.
                            Le simple fait de changer une variable, un paramètre, ou même la syntaxe fait que le résultat de la requête n'est pas en cache et que donc il attend que le lock soit levé.

                            Tracker avait raison...le lOCK ne fonctionnait pas exactement comme je le pensais. :o)
                            Merci a tous pour votre aide, j'ai appris pleins de trucs grâce a vous.

                            Merci
                            • Partager sur Facebook
                            • Partager sur Twitter

                            LOCK TABLE

                            × 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