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 :

[Transaction] Comment bien le traiter ? [PostgreSQL]


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut [Transaction] Comment bien le traiter ?
    Bonjour à tous,

    j'ai besoin d'utiliser les transactions.
    Je ne parle pas de la BD que j'utilise car ma préoccupation est plus de savoir comment procéder pour bien traiter une transaction.
    Comme mysql est fortement utilisé, je l'utiliserai dans mon exemple.

    La base SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BEGIN
    les requêtes SQL (ajout, modif, suppression, ...)
    COMMIT (si tout est ok) ou ROLLBACK (en cas de souci)
    Solution 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?php
    $resultat = mysql_query("BEGIN;DELETE FROM utilisateurs WHERE id=10;INSERT INTO utilisateursPro VALUES (10,'Durand','Jean-Michel');COMMIT");
    if($resultat !== FALSE)
        echo "Jean-Michel Durand est passé pro";
    else
        echo "Echec de la transaction";
    ?>
    Solution 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $resultat = mysql_query("BEGIN;");
    if($resultat !== FALSE) {
        echo "Jean-Michel Durand est passé pro";
        $resultat = mysql_query("DELETE FROM utilisateurs WHERE id=10;INSERT INTO utilisateursPro VALUES (10,'Durand','Jean-Michel');
        if($resultat !== FALSE)
            $resultat = mysql_query("COMMIT;");
        else
            echo "Echec de la transaction";
    }
    else
        echo "Echec de la transaction";
    La solution 1 est apparemment déconseillée, quant à la solution 2, pour moi, elle n'a pas de sens, étant donné que les requêtes sont bien envoyés les unes à la suite des autres mais elles sont indépendantes (envoyés dans des mysql_query différent).
    Mais dans ce cas, comment procéder pour bien traiter une transaction ?


    Merci d'avance pour vos aides/suggestions.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut

    Le principe-même d'une transaction est de ne pas l'exécuter en un seul bloc. Ici tu veux faire une suppression et une insertion. Le système de transaction te garantit que l'une ne se fera pas sans l'autre.

    Il te faut donc un système du genre :
    begin
    delete
    si delete foire : rollback
    sinon : insert
    si insert foire : rollback
    sinon : commit

    Le mieux étant d'utiliser un système moderne gérant des exceptions (comme PDO), ce qui te permet de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $pdo->beginTransaction();
    try {
    	// ton delete
    	// ton insert
    	// commit
    	$pdo->commit();
    } catch(PDOException $e) {
    	// au moindre problème, quel qu'il soit, rollback
    	$pdo->rollback();
    }

  3. #3
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut
    Bonjour et merci.

    Le try catch avec le rollback est pas mal.

    Une question toujours sur les transactions, mais axé sur un SGBDR.
    Il s'agit de PostGreSQL.

    Je sais que pour MySQL, les tables au format InnoDB supportent les transactions (pas MyISAM).

    Sur PostgreSQL, comment voir via PGAdmin le format des tables ?
    Quel format supporte les transactions ?

    Merci d'avance.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je pense que les transactions sont supportées en standard dans Postgresql qui, contrairement à MySQL, ne propose à ma connaissance qu'un moteur de données très proche de la norme SQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre actif
    Inscrit en
    Mars 2004
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 290
    Points : 217
    Points
    217
    Par défaut
    D'accord.

    Pas besoin de savoir le format des tables dans ce cas pour PostgreSQL.

    Pour MySQL, je confirme que le moteur par défaut affecté aux tables est MyISAM. InnoDB le gère (son successeur FALCON), ainsi que d'autres moteurs.

    Merci pour vos remarques.

    A bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment bien déboguer son code ?
    Par D[r]eadLock dans le forum Débuter
    Réponses: 47
    Dernier message: 02/04/2024, 16h06
  2. Paypal comment bien traiter l'IPN
    Par splifferwolf dans le forum E-Commerce
    Réponses: 2
    Dernier message: 06/01/2011, 21h03
  3. Comment bien utiliser les transactions
    Par babacan dans le forum Développement
    Réponses: 4
    Dernier message: 22/06/2009, 08h23
  4. Comment bien utiliser ce forum ?
    Par Alcatîz dans le forum Pascal
    Réponses: 0
    Dernier message: 21/04/2004, 16h37
  5. Comment bien gerer la mémoire avec les TStringList?
    Par david_chardonnet dans le forum Langage
    Réponses: 5
    Dernier message: 18/06/2003, 09h57

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