PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 16/02/2011 14:55:46

genio
Membre

Blocage ...

Re-bonjour...
En regardant mon moniteur de transaction via pgAdmiIII, je vois les choses suivantes  :
... PID ...  debut de requete               blocage         requete

   00002  2011/02/16  11:56:54        00004             delete from TableTOTO       where donnée=2010
   00003  2011/02/16  11:56:51                              delete from TableTOTO       where donnée=2010
   00004  2011/02/16  11:56:50                              delete from TableTOTO       where donnée=2010

Donc une 'contention' entre mon PID 00002 et 0004 QUI BLOQUE les 3 'delete'...  Cette situation a duré quelques minutes avant de se  décanter => ok

Quand je regarde les verrous, je vois, dans la pid qui a bloqué '00004', des lignes qui s'accumulent avec des choses comme : ExclusiveLock, suivis de Roweclusivelock, accessSharelock etc...
Moi qui croyait que postgrès ne bloquait pas les lignes mise à jour, je suis un peu perplexe...
Pouvez-vous m'expliquer le role de ces différents locks ?

Merci d'avance...

PS : Quelle est le lien entre la 'relation' et le 'PID' ?

Hors ligne

#2 16/02/2011 15:01:01

Marc Cousin
Membre

Re : Blocage ...

PostgreSQL ne bloque pas les lignes mises à jour… pour les lecteurs (SELECT). C'est à dire que les lecteurs ne bloquent pas les écrivains, les écrivains ne bloquent pas les lecteurs, et les lecteurs ne se bloquent pas entre eux.

Par contre, les écrivains, si ils veulent modifier la même donnée, se bloquent entre eux (et c'est heureux).

Donc si 3 delete ont été lancés comme là, à quelques secondes d'intervalle, les 00003 et 00004 voient encore les enregistrements de TableTOTO (00002 n'a pas encore commité). Eux aussi veulent donc effacer les enregistrements correspondant à la clause where. Mais ils doivent attendre de savoir si 00002 commit (dans ce cas là, les enregistrements ne sont plus visibles pour eux) ou rollback (dans ce cas là, c'est à eux de faire le travail).

Regardez le chapitre MVCC de la doc PostgreSQL, il explique tout ça très clairement: http://docs.postgresql.fr/9.0/mvcc.html


Marc.

Hors ligne

#3 16/02/2011 15:09:05

daamien
damien clochard

Re : Blocage ...

Le PID c'est l'identifiant du processus système qui traite la requête.  Tu peux retrouver la listes des processus avec la commande "ps -u postgres" (sous linux)

Il est possible de provoquer un ROLLBACK sur une transaction donnée en utilisant le PID . Par exemple si veut annuler le premier DELETE pour laisser passer les autres, il suffit de taper la requête SQL suivante :

SELECT pg_cancel_backend('00002');

Hors ligne

#4 16/02/2011 15:12:27

Marc Cousin
Membre

Re : Blocage ...

Il n'y a pas vraiment de lien entre la 'relation' et le 'pid'. Une relation, c'est le terme de l'algèbre relationnelle. On appelle ça une table en SQL. En interne, PostgreSQL utilise des termes de l'algèbre relationnelle, c'est un peu déroutant quand on n'en a pas l'habitude.


Marc.

Hors ligne

Pied de page des forums