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 :

État d'une transaction


Sujet :

PHP & Base de données

  1. #1
    Membre chevronné
    Avatar de eric.pommereau
    Homme Profil pro
    Ingénieur, pôle cartographie
    Inscrit en
    Décembre 2004
    Messages
    715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur, pôle cartographie
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2004
    Messages : 715
    Points : 1 790
    Points
    1 790
    Par défaut État d'une transaction
    Bonjour,

    Est ce possible avec la librairie PDO (abstration de données) de savoir si une transaction a été commencée sur une connexion ou non ...

    J'ai besoin de ça pour faire le cas échéant un rollback() quand une exception est levée.

    En gros j'aimerais bien faire un genre de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try {
       ...
    }
    catch(exception $ex) {
       if($pdoConnexion->isActiveTrans())
       {
          $pdoConnexion->rollback();
       }
     
       echo $ex->getTraceAsString();   
    }
    Je n'ai pas trouvé dans la lib ce genre de fonction ...

    Merci de vos idées ...

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Janvier 2006
    Messages : 43
    Points : 43
    Points
    43
    Par défaut
    Avec ce que j'ai compris, c'est toi qui décide quand commence une transaction [beginTransaction()] et quand elle se termine [commit()].
    Ensuite le rollBack() se met en action tout seul dès qu'une des requêtes SQL comprises entre le début et la fin de la transaction rencontrent un problème.
    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
    try 
        {    
            // DEBUT DE LA TRANSACTION
            $pdoConnexion->beginTransaction();
     
            // LES REQUETES SQL A EXECUTER
     
            // FIN DE LA TRANSACTION        
            $pdoConnexion->commit();
        }
    catch (PDOException $ex)
        {
            // ANNULATION EN CAS D'ERREUR
            $pdoConnexion->rollBack();
            echo "ERREUR : problème lors de l'insertions des données";
        }
    Sinon j'ai ouvert un post au sujet des retour d'expériences sur PDO, si tu veux bien y participer, cela pourrait être sympa
    C'est ici

  3. #3
    Membre chevronné
    Avatar de eric.pommereau
    Homme Profil pro
    Ingénieur, pôle cartographie
    Inscrit en
    Décembre 2004
    Messages
    715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur, pôle cartographie
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2004
    Messages : 715
    Points : 1 790
    Points
    1 790
    Par défaut
    En fait quelques cas se produisent où une exception est levée alors que la transaction n'a pas commencée (par exemple à l'initialisation de la connexion)

    Dans ce cas de figure j'aimerais savoir si j'ai démarré ou non une transaction. (pour faire un rollback ou non).

    Pour ce qui est du retour d'expérience je regarde ça ... en tout cas merci d'avoir répondu

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Janvier 2006
    Messages : 43
    Points : 43
    Points
    43
    Par défaut
    Si une exception est lancée lors de l'initialisation de la connection, il n'y a pas de connection et la transaction n'a pu commencer... Tu n'as qu'à mettre tout dans le Try (déclaration de ta connection et toute ta transaction) et à la moindre erreur, le Catch prend le relais...

    Regarde l'exemple 5 de PDO sur coolcoyote.net : lien.

    J'espère avoir bien compris ton problème et avoir pu t'aider

    Bien à vous tous...

  5. #5
    Membre chevronné
    Avatar de eric.pommereau
    Homme Profil pro
    Ingénieur, pôle cartographie
    Inscrit en
    Décembre 2004
    Messages
    715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur, pôle cartographie
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2004
    Messages : 715
    Points : 1 790
    Points
    1 790
    Par défaut
    Tous mes traitements DB ou autres sont dans des classes. Si un de mes traitement (la lecture de mon fichier de configuration par exemple) merde, une exception est levée et je récupère ça dans mon catch.

    Dans mon catch je voudrais, dans le cas où je suis en train de toucher à ma base, pouvoir passer ou non mon rollback.

    Désolé si je ne m'explique pas super bien !!!

    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
     
        $oPanierDb = new PanierDb();
            try {
                $oPanierDb->connect($pdo_str_conn, MYSQL_USER, MYSQL_PWD);
                echo 'connexion ok !!!<br />';
                $oPanierDb->begintrans();
     
                $oPanierDb->addFolder('TEST FOLDER', 28, 'DUPONT');                
                $oPanierDb->commit();
                echo 'Dossier ajouté !! <br />';
     
            } 
            catch (Exception $ex){
                ExceptionRender::render($ex);
                $oPanierDb->rollback();  // Je voudrais bien savoir si une transaction a débutée     
                exit(-1);
            }
    Je pourrais faire plusieurs try catch ...

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Janvier 2006
    Messages : 43
    Points : 43
    Points
    43
    Par défaut
    Tu peux effectivement faire plusieurs catch selon les différentes erreurs rencontrées. Pour ma part, je n'ai pas encore mis cela en place, mais cela m'intéresse. Il faut tester...

Discussions similaires

  1. [2.x] Transaction et état d'une entity
    Par Pilo0 dans le forum Symfony
    Réponses: 0
    Dernier message: 21/02/2012, 14h50
  2. Vérifier l'état d'une transaction
    Par vg-matrix dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/07/2010, 19h53
  3. [SGBD]Evaluation du temps d'une transaction
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 26/10/2004, 18h53
  4. Connaître l'état d'une connexion réseau
    Par SteelBox dans le forum Windows
    Réponses: 8
    Dernier message: 29/07/2004, 13h30
  5. Utilisation d'une transaction
    Par Bernard M dans le forum Bases de données
    Réponses: 6
    Dernier message: 22/04/2004, 00h31

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