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/ -->
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 |