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 :

Les transactions MySQL [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 376
    Par défaut Les transactions MySQL
    Bonjour,

    Je souhaiterais savoir comment faire une transaction MySQL.

    J'ai pas mal cherché sur le web mais rien ne fonctionne.

    Il faut utiliser COMMIT et ROOLBACK.

    merci d'avance

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    La documentation est pourtant simple :
    http://dev.mysql.com/doc/refman/5.0/fr/commit.html

    Quel probleme rencontres-tu ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 376
    Par défaut
    Merci pour le tuto mais je n'arrive pas à l'intégrer voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $insertion = "INSERT INTO materiel VALUES ('' , 'ordinateur');";
    $result = mysql_query($insertion);
    if ($result == TRUE) {
    	echo 'valider les changement dans la base de données';
    }else{
    	echo 'annuler les changement dans la base de données';
    }
    Puis-je avoir un exemple ? merci

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Je ne vois rien dans votre code qui reprenne l'exemple de transaction que je vous ai donné.
    Pensez juste bien que mysql_query() traite une seule requete a la fois et donc qu'il faut ecrire chaque instruction de la transaction dans un mysql_query() different.

    Par contre pour suivre la logique de ce que vous avez ecris, dans le cas ou mysql_query() renvoit FALSE, il n'y aurait rien a annuler puisque la requete n'aurait pas été traité.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 376
    Par défaut
    Je ne savais pas que l'on devais recommencer une transaction après chaque requête merci de me l'avoir dit

    Dans mon cas je fais plusieurs insertions et si une se passe mal, j'annule toutes celles déjà faites.

    Je ne vois pas trop comment faire ça avec "mysql_query()" avez-vous une solution niveau code merci.

  6. #6
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    J'ajouterai que les transaction seront utilisées quand les requetes SQL se sont executé sans erreur. De plus les transactions seront interressante dans le cas de plusieurs operations atomiques DML
    exemple de transaction bancaire d'un compte A vers un compte B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mysql_query("start transaction");
    mysql_query("Soustraire 100 euro du compte A"); // pseudo requete
    mysql_query("Ajouter 100 euro au compte B"); // pseudo requete
    mysq_query("commit"); // enregister les changement
    Le but c'est d'assurer que le transfers d'argent se fasse normalement

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 376
    Par défaut
    Merci buggen25 je commence a me rendre compte que les transactions ne sont pas adaptés à mon cas .

    Comment puis-je faire alors pour annuler toutes les insertions que j'ai faites dans la base de données si une à eu un problème ?

    merci

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Je ne savais pas que l'on devais recommencer une transaction après chaque requête merci de me l'avoir dit
    Je n'ai pas dit ca : mysql_query() ne peut traiter qu'une requete a la fois, donc il faut executer chaque requete de ta transaction avec un mysql_query() different.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 376
    Par défaut
    ok j'avais pas tout compris désolé

    Au niveau code comment ce traduit ma question :

    Comment puis-je faire alors pour annuler toutes les insertions que j'ai faites dans la base de données si une à eu un problème ?

    Merci

  10. #10
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 494
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 494
    Par défaut
    salut,
    l'instruction commit valide les requetes faites depuis l'ancien commit...
    ainsi, si une transaction est correct, vous pouvez la valider avec le commit (comme l'a suggere buggen25)
    et si une requete n'est pas correcte, vous pouvez utiliser le rollback qui ne validera pas les requetes faites depuis l'ancien commit.

    il faut faire attention avec les rollback ca peu etre, d'autres utilisateurs auront fait des requetes entre temps...
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  11. #11
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Citation Envoyé par dark snake sw Voir le message
    ok j'avais pas tout compris désolé

    Au niveau code comment ce traduit ma question :

    Comment puis-je faire alors pour annuler toutes les insertions que j'ai faites dans la base de données si une à eu un problème ?

    Merci
    Devine avec les transactions, sous reserve de ne pas utiliser une clé de type auoincrement. il faut créer une fonction php ( je ne sais pas comment faire une fonction en php )
    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
     
    mysql_query("START TRANSACTION");
    $result = mysql_query($insertion);
    if ($result == FALSE) 
    {
      mysql_query("ROLLBACK");
      return; // retourner de la fonction
    }
    $result = mysql_query($insertion2);
    if ($result == FALSE) 
    {
      mysql_query("ROLLBACK");
      return; // retourner de la fonction
    }
    ...
    mysql_query("COMMIT"); // ici on valide les changements
    sans oublier que les tables de type MYISAM ne sont pas transactionnelles, par defaut mysql utilise le moteur InnoDB qui est transactionnel

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 37
    Par défaut
    Citation Envoyé par DEMMOTTE Voir le message
    il faut faire attention avec les rollback ca peu etre, d'autres utilisateurs auront fait des requetes entre temps...
    Non.
    Le COMMIT ou le ROLLBACK ne concerne que la transaction en cours de la session courante.

    En aucun cas, un ROLLBACK ne va annuler les transactions des autres utilisateurs !


    HTH.
    DBRep

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Que se passe t'il si je fais une transaction, qu'un autre utilisateur modifie une valeur et que je fais un rollback ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Que se passe t'il si je fais une transaction, qu'un autre utilisateur modifie une valeur et que je fais un rollback ?
    Oui il y a un hic
    je pense que pour chaque thread (connection utilisateur) est definie une transaction isolée des autres threads, biensur le niveau d'isolation peut etre modifié.
    Voir ici :
    http://dev.mysql.com/doc/refman/5.0/...isolation.html

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 37
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Que se passe t'il si je fais une transaction, qu'un autre utilisateur modifie une valeur et que je fais un rollback ?
    Normalement (en mode transaction isolation level 1), l'autre utilisateur doit être "bloqué" avant de pouvoir faire sa modification (sous-entendons qu'on est sur le même record), le temps que le premier utilisateur COMMIT ou ROLLBACK sa transaction.


    HTH
    DBRep

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 376
    Par défaut
    Merci à tous ça fonctionne !

    Tous vos conseils m'ont bien aidés

  17. #17
    Membre très actif
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Par défaut
    Citation Envoyé par DBRep Voir le message
    Normalement (en mode transaction isolation level 1), l'autre utilisateur doit être "bloqué" avant de pouvoir faire sa modification (sous-entendons qu'on est sur le même record), le temps que le premier utilisateur COMMIT ou ROLLBACK sa transaction.
    HTH
    DBRep
    Pendant que le thread (ou session utilisateur si on veut) est au milieu de sa transaction, alors les autres threads attendront juqu'a ce qui'il termine, c'est une sorte d'exclusion mutuelle, pour verifier c'est simple,
    Mettre dans la variable d'environnement PATH le chemin vers le bin de l'installation mysql(ou easy php),
    cmd,
    tapper mysql,
    Normalement il va afficher mysql> (sinon tapper dans cmd mysql -u root -p et tapper le password)
    On crée alors un premier thread,
    On en crée un deuxieme
    et on teste les transactions, en changeant les niveau d'isolation cité dans :
    http://dev.mysql.com/doc/refman/5.0/...isolation.html

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

Discussions similaires

  1. [PDO] PDO/MYSQL: les transactions?
    Par Helfima dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/04/2009, 10h04
  2. 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
  3. les Transactions sous interbase
    Par kouraichi35 dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/10/2004, 11h15
  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