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 :

rollback ne se fait pas sur la totalité de la transaction [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut rollback ne se fait pas sur la totalité de la transaction
    Bonjour à tous,

    J'essaye de faire une transaction mais lorsque une exception est levée le rollback ne se fait pas sur la totalité des requêtes effectuées.

    Pour le vérifier j'ai volontairement introduit une erreur lors du 2eme passage de ma boucle foreach pour que la clause WHERE du UPDATE n'existe 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    $dbh1->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
    $dbh1->beginTransaction();
     
    try{ // DEBUT DE TRANSACTION
     
    $query_inFacture="INSERT INTO factures_vendeurs SET 
    date='".date('Y-m-d')."',  
    IDVendeur=".$IDvendeur.", 
    IDClients='".$clientBdd."', 
    actis='".$refBdd."',
    type='".$typeBdd."',
    guidAcc=".$guidAcc.",  
    montant='".$montantBdd."'";
     
    $dbh1->exec($query_inFacture);
    $IDFacture=$dbh1->lastInsertId();
     
    foreach($tabClient as $key=>$value){
     
    $query_rsClient="SELECT revendPaye, typeRef, IDRef FROM clients WHERE ID=".$value;
     
    $rsClient=$dbh1->query($query_rsClient);
    $row_rsClient = $rsClient->fetch(PDO::FETCH_ASSOC);
     
    // ici traitement des données
     
    if($k==0)$query_rsMajClient="UPDATE clients SET revendPaye='".$majPaye."' WHERE ID=".$value;
    else $query_rsMajClient="UPDATE clients SET revendPaye='".$majPaye."' WHERE ID=xx";
    $k++;
     
    $dbh1->exec($query_rsMajClient);
     
    };
     
    $dbh1->commit();
    } 
    catch(Exception $e){
    echo $e->getMessage();
    $dbh1->rollBack();
    }; // FIN DE TRANSACTION
    l'exception est bien levée, le rollback se fait en partie et annule le "INSERT INTO factures_vendeurs..." mais le premier "UPDATE clients..." n'est pas annulé, les valeurs modifiées sont toujours présentes dans la table client.

    est-il bien possible de revenir en arrière sur plusieurs requêtes dans la même table ?

    Merci d'avance pour vos réponses

  2. #2
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Quel est le moteur MySQL que tu utilise, car les transactions en dépendent ?
    Ceci pourra ce faire avec InnoDB, mais pas MyISAM par exemple.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Toutes les tables concernées sont en innoDB

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Points : 316
    Points
    316
    Par défaut
    Non pardon

    Tu as tout à fait raison ma table client est en MyISAM

    Merci j'étais trop persuadé qu'elle était en innoDB

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

Discussions similaires

  1. Ouvrir une socket sur un PC qui ne fait pas partie du réseau local
    Par Poupinelelapin dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 03/04/2010, 23h16
  2. La copie sur disque miroir ne se fait pas
    Par defluc dans le forum Composants
    Réponses: 0
    Dernier message: 12/02/2010, 19h51
  3. Réponses: 1
    Dernier message: 12/05/2009, 09h50
  4. Réponses: 3
    Dernier message: 29/08/2007, 12h58
  5. Réponses: 2
    Dernier message: 09/02/2007, 14h36

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