Discussion:
violation de contrainte...
(trop ancien pour répondre)
thierry
2007-01-23 22:05:31 UTC
Permalink
bonjour,

je suis en train de coder (en PHP) une application mettant en oeuvre une
base de données.

j'avais pris l'habitude de gérer les violations de contraintes, clé
dupliquées, comme suit

$res =& $db->query("insert...");
if ( PEAR::isError($res) ) {
//gestion de l'erreur
}

dans un script d'insertion massif j'ai systématiquement un plantage du
thread apache gérant le script.

Aprés avoir pas mal tourné en rond du coté des exceptions j'en suis
arrivé à la constatation suivante: si je procéde comme suis ... plus
d'erreur:

$res =& $db->query("select...");
if ( $res->numRows() > 0 ) {
//gestion de l'erreur
return;
}
//insert...

voilà.... qqn peut confirmer ou me dire pq ce que je faisais c'est mal.

merci d'avance

thierry

PS: le lecteur averti aura remarqué que j'utilise MDB2 de pear.php.net
P'tit Marcel
2007-01-24 00:00:29 UTC
Permalink
Post by thierry
je suis en train de coder (en PHP) une application mettant en oeuvre une
base de données.
j'avais pris l'habitude de gérer les violations de contraintes, clé
dupliquées, comme suit
$res =& $db->query("insert...");
if ( PEAR::isError($res) ) {
//gestion de l'erreur
}
Aprés avoir pas mal tourné en rond du coté des exceptions j'en suis
arrivé à la constatation suivante: si je procéde comme suis ... plus
$res =& $db->query("select...");
if ( $res->numRows() > 0 ) {
//gestion de l'erreur
return;
}
//insert...
voilà.... qqn peut confirmer ou me dire pq ce que je faisais c'est mal.
Pour ce qui concerne Php, les deux approches sont possibles et pas moins
bonne l'une que l'autre.

Pour ce qui concerne le SGBD, l'approche insert/exception consomme moins
de ressource (une seule requête au lieu de deux) mais AMHA elle est à
déconseiller car dépendant d'éléments extérieurs au programe php :
- activation des contraintes de clé dans la base
- capacité de l'interface MDB2 à transmettre les exceptions

Cette approche en insert/except est pertinente dans deux cas seulement :
- lorsque les critères de performance sont essentiels (ce qui est de
moins en moins le cas au vu des capacités actuelles des matériels)
- lorsque tu peux être sûr des contraintes gérées par le SGBD (parce
que tu en es l'administrateur, ou que le script php les vérifie en
amont) et par l'interface

Ici, ton approche en select/insert me semble insuffisante car elle
échouerait en cas d'insertion effectuée par un autre client entre le
select et le insert. Il faudrait gérer un verrou (genre lock table) ou
fonctionner par transaction.


a+
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/
Continuer la lecture sur narkive:
Loading...