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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-fr-generale by date

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