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 :

try catch dans une transaction


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 149
    Points : 66
    Points
    66
    Par défaut try catch dans une transaction
    Bonjour.
    Alors voila, j'essaye de mettre des try catch autours de requete qui se trouvent elles même dans une transaction. Toutes fois, a chaque fois qu'une de mes requête échoue, la transaction annule toutes les requêtes, ce n'est pas ce que je veux. Voila en gros a quoi ressemble mon code:
    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
    $transaction=Yii::app()->db->beginTransaction();
    $success=true;
    $code=0
    try
    {
    	requete 1;
    }catch (Exception $e) {
    	$code=$e->getCode();
    }
    if($code==0 || $code==xxx)
    	requete 2;
    else
    	$success=false;
    if($success)
    	$transaction->commit();
    else
    	$transaction->rollback();
    Comment faire pour que le code xxx retourné par la requête 1 ne soit pas considérée comme une erreur par la transaction?

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Si je ne m'abuse c'est la raison d'être d'une transaction. Si quelque chose se passe mal , on rollback l'ensemble de la transaction. Ca me semble être un comportement normal qu'il ne faut pas essayer de modifier.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 149
    Points : 66
    Points
    66
    Par défaut
    D'accord, mais dans mon cas, il est possible que mon code tente plusieurs fois d'ajouter une même ligne. Ainsi dans ce cas, je voudrais capturé l'erreur unique violation et continuer mon code comme si de rien n'était. Est ce possible, si oui, comment?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Voilà 2 solutions:
    1) Créer un SAVEPOINT avant l'insertion qui peut échouer, et en cas d'échec faire un ROLLBACK TO vers le savepoint. Après quoi il est possible de continuer à utiliser la transaction.

    2) Faire l'insertion dans une procédure plpgsql avec un bloc qui attrape l'exception (donc qui n'arrivera jamais au php). Il y a un exemple dans la doc de postgresql, qui sert à faire un insert ou update en cas de violation de clef primaire.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 149
    Points : 66
    Points
    66
    Par défaut
    En fait mon problème ne vient pas d’où je pensais...
    Ma première requête me renvoie l'erreur 23505 (violation de la contrainte unique). Du coup je ne prends pas cette erreur en compte et je continue.
    Par contre pour ma requête 2, quel qu'elle soit, j'obtiens l'erreur 25P02 (IN FAILED SQL TRANSACTION). D’où vient cette erreur, et comment l'éviter?

    PS: si je ne mets pas ma deuxième requête, la transaction se commit quand même si j'ai l'erreur 23505, c'est bien ce que je veux.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par Cyanatide Voir le message
    En fait mon problème ne vient pas d’où je pensais...
    Ma première requête me renvoie l'erreur 23505 (violation de la contrainte unique). Du coup je ne prends pas cette erreur en compte et je continue.
    Par contre pour ma requête 2, quel qu'elle soit, j'obtiens l'erreur 25P02 (IN FAILED SQL TRANSACTION). D’où vient cette erreur, et comment l'éviter?
    Une fois qu'une erreur SQL est survenue dans une transaction, toute instruction ultérieure dans cette transaction va immédiatement échouer. Sauf si l'erreur est gérée au niveau SQL avec une des deux méthodes citées plus haut. Il est impossible de le faire avec uniquement le try/catch de PDO.

Discussions similaires

  1. [T-SQL] Erreur non "catchée" dans une transaction
    Par Peanut dans le forum Développement
    Réponses: 2
    Dernier message: 29/09/2011, 15h50
  2. Utilisation de try catch dans une procédure de backup de database
    Par megtrinity dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 05/11/2009, 14h53
  3. Try, catch dans une fonction
    Par mactwist69 dans le forum Windows Forms
    Réponses: 10
    Dernier message: 10/07/2008, 16h39
  4. Try/ catch dans une fonction ActionPerformed
    Par thomas2929 dans le forum Langage
    Réponses: 13
    Dernier message: 09/06/2008, 12h06
  5. Try catch dans une dll - possible ?
    Par Pendary dans le forum C++Builder
    Réponses: 1
    Dernier message: 02/03/2007, 16h48

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