p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Nouveau Membre du Club
    Inscrit en
    décembre 2009
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : décembre 2009
    Messages : 136
    Points : 34
    Points
    34

    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
    Dév. Web / Android
    Inscrit en
    août 2003
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Dév. Web / Android
    Secteur : Industrie

    Informations forums :
    Inscription : août 2003
    Messages : 3 499
    Points : 8 401
    Points
    8 401

    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.

  3. #3
    Nouveau Membre du Club
    Inscrit en
    décembre 2009
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : décembre 2009
    Messages : 136
    Points : 34
    Points
    34

    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
    Expert Confirmé
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 849
    Points : 2 815
    Points
    2 815

    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
    Nouveau Membre du Club
    Inscrit en
    décembre 2009
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : décembre 2009
    Messages : 136
    Points : 34
    Points
    34

    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
    Expert Confirmé
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 849
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 849
    Points : 2 815
    Points
    2 815

    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