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

Re: Reponse lente de postgres

From: Guillaume Lelarge <guillaume(at)lelarge(dot)info>
To: Hajatiana RAHOLIARIJAONA <administrateur(at)saisie(dot)mg>
Cc: Alain Lucari <eurlix(dot)alain(at)free(dot)fr>, pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: Reponse lente de postgres
Date: 2007-08-03 07:43:32
Message-ID: 46B2DCA4.2050703@lelarge.info (view raw or flat)
Thread:
Lists: pgsql-fr-generale
Bonjour,

Hajatiana RAHOLIARIJAONA a écrit :
>>[...]
>> guillaume(at)laptop:~$ ps -ef | grep postgres
>> 1000     16183 22198  0 22:22 ?        00:00:00 postgres: guillaume pgfr
>> [local] idle in transaction
>> 1000     16187 22198  0 22:22 ?        00:00:00 postgres: guillaume pgfr
>> [local] UPDATE waiting
> 
> C'est bien le phenomene qui se produisit. Des listes de waiting comme :
> UPDATE waiting; LOCK table waiting.
> 

J'aimerais bien comprendre pourquoi vous avez besoin du LOCK explicite.
Lorsque vous utilisez un LOCK explicite (donc LOCK TABLE a;), vous
obtenez un verrou exclusif sur la table en question. Il est donc même
impossible de faire un SELECT tant que ce verrou est présent. Seule une
fin de transaction/session permettra aux autres processus d'accéder à
cette table.

> Je m'explique un peu :
> Un ou plusieurs utilsateurs inserent des données dans trois tables
> differentes (ce sont les préparateurs), une operation compte environ
> 2000 à 2500 lignes(environ 50 à 60.000 lignes /jour) . Ces données
> seront ensuite utilisé et updatés par l'ensemble de production.
> Le pb se maifeste quand les préparateurs inserent ses données et en même
> temps la production met à jour dans les tables d'insertion.
> Les insertions debutent par un BEGIN TRANSACTION et se termine par
> COMMIT ou ROLLBACK s'il y a erreur.
> 
> C'est pourquoi je me demande si les tables entieres sont verouillés ou
> il y a un nombre limite de UPDATE quand on fait des insertions.
> Le verouillage au niveau de la production est "SELECT for update".
> 

Si vous utilisez LOCK, vous verrouillez la table complète.

Dans les autres cas, vous ne verrouillez que les lignes concernées par
l'UPDATE ou le SELECT FOR UPDATE. Par exemple, si vous faites un
  SELECT * FROM ma_table FOR UPDATE;
vous verrouillez la table ma_table entièrement (verrou RowShareLock mais
sur toute la table). Par contre, si vous faites un
  SELECT * FROM ma_table WHERE id=3 FOR UPDATE;
vous verrouillez seulement les lignes dont id vaut 3. Toutes les autres
lignes sont modifiables, supprimables, insérables, etc.

(Même chose pour l'UPDATE dans une transaction.)

Dans le cas indiqué, je ne vois que le coup du LOCK, tout simplement
parce que le SELECT FOR UPDATE ne renverra aucune ligne (et donc ne
bloquera aucune ligne) si la transaction d'insertion des données n'est
pas terminée.


-- 
Guillaume.
<!-- http://abs.traduc.org/
     http://lfs.traduc.org/
     http://docs.postgresqlfr.org/ -->

In response to

pgsql-fr-generale by date

Next:From: David TokmatchiDate: 2007-08-16 07:42:04
Subject: Migrer UTF8 vers LATIN1
Previous:From: Hajatiana RAHOLIARIJAONADate: 2007-08-03 07:01:39
Subject: Re: Reponse lente de postgres

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