Précédent   Forum du club des développeurs et IT Pro > PHP > PHP & SGBD > PHP & PostgreSQL
PHP & PostgreSQL Forum d'entraide sur PostgreSQL avec PHP. Avant de poster -> FAQ PostgreSQL, Cours PostgreSQL. Pour les questions concernant le moteur PostgreSQL plutôt que les fonctions PHP, merci d'utiliser le forum PostgreSQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/10/2011, 14h18   #1
Cyanatide
Membre à l'essai
 
Inscription : décembre 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 109
Points : 23
Points : 23
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?
Cyanatide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 14h45   #2
grunk
Modérateur
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 2 499
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 28
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 2 499
Points : 5 214
Points : 5 214
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.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 15h39   #3
Cyanatide
Membre à l'essai
 
Inscription : décembre 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 109
Points : 23
Points : 23
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?
Cyanatide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 20h02   #4
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 702
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 702
Points : 2 347
Points : 2 347
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.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 09h10   #5
Cyanatide
Membre à l'essai
 
Inscription : décembre 2009
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 109
Points : 23
Points : 23
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.
Cyanatide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 11h56   #6
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 702
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 702
Points : 2 347
Points : 2 347
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.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h55.


 
 
 
 
Partenaires

Hébergement Web