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.orgBonjour à 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