Skip site navigation (1) Skip section navigation (2)

[pgsql-fr-generale] Problème de lock posi?==?iso-8859-1?Q?tionné sur un COPY

From: SOUCHARD Jean-Michel DSIC BI <jean-michel(dot)souchard(at)interieur(dot)gouv(dot)fr>
To: pgsql-fr-generale(at)postgresql(dot)org
Cc: ROELTGEN Pierre-Andre DSIC DESP <pierre-andre(dot)roeltgen(at)interieur(dot)gouv(dot)fr>,MOREAU Michel-Patrice DSIC SDEL <michel-patrice(dot)moreau(at)interieur(dot)gouv(dot)fr>,LEROY Beatrice SRSIC78 <beatrice(dot)leroy(at)interieur(dot)gouv(dot)fr>,REISS Thomas DSIC DESP <thomas(dot)reiss(at)interieur(dot)gouv(dot)fr>
Subject: [pgsql-fr-generale] Problème de lock posi?==?iso-8859-1?Q?tionné sur un COPY
Date: 2006-09-21 13:00:27
Message-ID: FC9AD8D97DEC994DBAEC2F3B4DFA35C80560D7A7@msg01nel.exac.ctiac.dsic.mi (view raw or flat)
Thread:
Lists: pgsql-fr-generale
Bonjour, 
 
Après m'être renseigné sur le code PHP (je n'en suis pas dépositaire), voici
davantage de précisions. Je vous livre le cas d'utilisation ainsi que le
mail d'origine et le mail de réaction de Daniel Verite.
Toutes les utilisations qui posent problèmes (cf. message en rouge plus bas)
sont faites dans des fonctions d'un programme PHP de la manière suivante :
 
...
$this->query = "copy <nom_de_table> (<nom_de_colonnes<) from stdin";
$this->query();
...
pg_put_line(<connection>,<chaine_de_caracteres_a_inserer>);
...
pg_put_line(<connection>, " <file://\\.\n> \\.\n");
pg_end_copy(<connection>); 
...
 
Ce qui semble conforme aux préconisations de la documentation PHP de
postgreSQL. Malgré tout, on observe, quand le traitement est lancé plusieurs
fois pour des données différentes, un blocage avec le message en rouge
ci-dessous, précédemment cité.
 
Est-ce que quelqu'un peut m'expliquer comment éviter ce blocage ? Rien dans
la documentation de la commande "copy" n'indique cette limitation...Y a t'il
des paramètres à positionner ?
 
D'avance, merci !
Cordialement
JM Souchard
 
 
  _____  

 pgsql-fr-generale-owner(at)postgresql(dot)org
<mailto:pgsql-fr-generale-owner(at)postgresql(dot)org> ; de la part de; Daniel
Verite [daniel(at)manitou-mail(dot)org]
Mais la commande COPY en soit ne fait rien pour bloquer les écritures
concurrentes, ce serait au moins mentionné dans la doc.

Dans le contexte d'erreur que vous montrez, on voit que la requête sur
laquelle il y a échec n'est pas un COPY mais un SELECT FOR UPDATE.

Comme ça se produit au niveau de la fonction pg_end_copy en php, ça
semblerait indiquer que ce serait plutôt un trigger (un statement trigger
sur insert, par

exemple) qui poserait problème.Vous pouvez vérifier si vous avez un trigger
sur la table destination du COPY?

--

Daniel

PostgreSQL-powered mail user agent and storage:
<http://www.manitou-mail.org/> http://www.manitou-mail.org



  _____  

De : pgsql-fr-generale-owner(at)postgresql(dot)org
[mailto:pgsql-fr-generale-owner(at)postgresql(dot)org] De la part de SOUCHARD
Jean-Michel DSIC BI
Envoyé : mardi 19 septembre 2006 14:31
À : pgsql-fr-generale(at)postgresql(dot)org
Cc : MOREAU Michel-Patrice DSIC SDEL; ROELTGEN Pierre-Andre DSIC DESP; REISS
Thomas DSIC DESP
Objet : [pgsql-fr-generale] [pgsql-fr-generale] Problème de lock positionné
sur un COPY



Bonjour à tous, 

On me demande d'examiner un problème de blocage d'application écrite en PHP
par une société de service (je n'ai pas encore de visibilité sur le code).
Dans le code PHP, la mise à jour des tables de la base se fait par DELETE
... puis des recalculs importants et la base est chargée par COPY à partir
de l'entrée standard. Le problème c'est que plusieurs utilisateurs peuvent
en même temps lancer cette fonctionnalité. Ce qui entraîne un blocage de
l'application et retourne l'erreur suivante :

[WARNING] pg_end_copy(): Query failed: ERREUR: Bloquage détecté DETAIL: 
Le processus 12671 attend ShareLock sur la transaction 1664756; bloqué 
par le processus 12676. Le processus 12676 attend ShareLock sur la 
transaction 1664757; bloqué par le processus 12671. CONTEXT: instruction 
SQL «SELECT 1 FROM ONLY "public"."ref_paragraphe" x WHERE 
"paragraphe_id" = $1 FOR UPDATE OF x» 
/MBGP/site/bgp2_2006/bgp2/classes/agent.class.php 706 

[WARNING] Cannot modify header information - headers already sent 
/MBGP/site/bgp2_2006/copix/utils/copix/core/CopixCoordination.class.php 
215 

Avant de trouver d'autres solutions, notamment modifications de code ou
organisationnelles, je désirais savoir si il y a un paramétrage spécial
évitant de planter en bloquage quand on lance plusieurs COPY en même temps
sur la même table (il s'agit de lignes différentes dans les tables). Un
traitement peut impacter jusqu'à 400*30000 lignes (12 millions de lignes),
raison, je pense, de l'utilisation de DELETE/COPY plutôt que DELETE/INSERT
ou UPDATE simple.

D'avance, merci 
JM Souchard 

pgsql-fr-generale by date

Next:From: Sébastien LardièreDate: 2006-09-21 13:22:08
Subject: Re: Sortie de livres sur PostgreSQL?
Previous:From: Jean-Christophe ArnuDate: 2006-09-21 12:18:08
Subject: Re: Sortie de livres sur PostgreSQL?

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group