Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Nouveau Membre du Club
    Inscrit en
    décembre 2009
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : décembre 2009
    Messages : 126
    Points : 29
    Points
    29

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

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

    Informations forums :
    Inscription : août 2003
    Messages : 3 093
    Points : 7 392
    Points
    7 392

    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
    126
    Détails du profil
    Informations forums :
    Inscription : décembre 2009
    Messages : 126
    Points : 29
    Points
    29

    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 831
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 831
    Points : 2 762
    Points
    2 762

    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
    126
    Détails du profil
    Informations forums :
    Inscription : décembre 2009
    Messages : 126
    Points : 29
    Points
    29

    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 831
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 831
    Points : 2 762
    Points
    2 762

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •