IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

PDO/MYSQL: les transactions?


Sujet :

PHP & Base de données

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 191
    Points : 275
    Points
    275
    Par défaut PDO/MYSQL: les transactions?
    Bonjour,
    j'ai pas tous compris sur les transactions avec PDO.
    je souhaite géré des données selon des arborescences par intervalles et pour cela je voudrai le gérer avec pdo sur mysql.
    ci-dessous une des méthodes de ma classe gérant les requetes sql et "Db" est une classe singleton contenant la classe PDO
    les méthodes étant explicite je détaille pas
    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
    public function update_limit_up($right_limit){
    	$db = Db::connect();
    	$db->beginTransaction();
    	$input[] = $right_limit;
    	$query  = " UPDATE ".$this->_table.
    			" SET `right_limit` = right_limit + 2" .
    			" WHERE `right_limit` > ?";
    	$result = $db->Execute($query, $input);
           	if(!$result) return false;
    	$query  = " UPDATE ".$this->_table.
    			" SET `left_limit` = left_limit + 2" .
    			" WHERE `left_limit` > ?";
    	$result = $db->Execute($query, $input);
    	$result = $db->commit();
           	if(!$result) return false;
    	return true;
    }
    le bout de code sert pour l'insertion d'une feuille dans l'arbre, je décale les bornes avant l'insertion.

    questions:
    1) je suis pas sure que mysql supporte ce type de transaction?
    2) si 2 actions sur ma méthode arrive en même temps cela risque d'être le bordel ou bien justement l'utilisation du commit après coup résolve ce problème. en effet si j'ai pas mal de ligne dans la table j'ai peur que les 2 requêtes s'exécute en parallèles.
    3) en cas d'incompatibilité avec mysql, comment je peux changer le delemiter de mysql avec PDO pour gérer cela avec des procédures stockées car mon hébergeur ne le permet pas sur phpmyadmin la version étant ancienne.

    j'espère avoir été claire dans mes questions.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    En fait il faudrait tester le retour de chaque Execute et faire un rollback en cas d'erreur. Votre code ne teste pas le 2e Execute et ne fait pas de rollback .

    Le mieux est d'activer les exceptions PDO et de faire la transaction dans un try-catch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        $db = new PDO( /* your connection string */ );
        $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
        public function update_limit_up($right_limit)
        {
            $bSucces = false;
     
    	try
            {
                 $db = Db::connect();
    	     $db->beginTransaction();
    	     $input[] = $right_limit;
    	     $query  = " UPDATE ".$this->_table.
    			     " SET `right_limit` = right_limit + 2" .
    			     " WHERE `right_limit` > ?";
    	     $db->Execute($query, $input);
    	     $query  = " UPDATE ".$this->_table.
    			     " SET `left_limit` = left_limit + 2" .
    			     " WHERE `left_limit` > ?";
    	     $db->Execute($query, $input);
    	     $db->commit();
     
    	     $bSucces = true;
            }
            catch (PDOException $e)
            {
                  // Try-catch au cas où le beginTransaction() n'a pas marché
                  try
                  {
                      $db->rollback();
                  }
                  catch (PDOException $e){}
            }
            return $bSucces;
        }

Discussions similaires

  1. [PDO] Transaction PDO mysql
    Par chat de nuit dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/10/2011, 16h33
  2. [MySQL] Les transactions MySQL
    Par Deciprog dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 09/03/2009, 12h32
  3. MySQL, ses procédures stockées et les transactions
    Par Shogun dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 11/02/2008, 21h19
  4. [interbase] gerer les transactions
    Par webbulls dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/05/2004, 18h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo