|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre à l'essai
![]() Inscription : décembre 2009 Messages : 109 ![]() |
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 :
|
||
|
|
00
|
|
|
#2 |
![]() ![]() Olivier Développeur Web Inscription : août 2003 Messages : 2 499 ![]() |
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.
|
|
00
|
|
|
#3 |
|
Membre à l'essai
![]() Inscription : décembre 2009 Messages : 109 ![]() |
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?
|
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : octobre 2008 Messages : 1 702 ![]() |
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. |
|
|
00
|
|
|
#5 |
|
Membre à l'essai
![]() Inscription : décembre 2009 Messages : 109 ![]() |
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. |
|
|
00
|
|
|
#6 | |
![]() ![]() Inscription : octobre 2008 Messages : 1 702 ![]() |
Citation:
|
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com