Re: Row level lock in plpgsql

From: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>
To: "Juan P(dot) Aviles" <jputem(at)yahoo(dot)es>
Cc: lista postgresql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Row level lock in plpgsql
Date: 2005-04-09 02:37:01
Message-ID: 20050409023701.GA18105@dcc.uchile.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Sat, Apr 09, 2005 at 04:04:36AM +0200, Juan P. Aviles wrote:

> Como diria un profe de mi universidad era error de capa 8, en realidad
> el bloqueo si se estaba haciendo lo que pasa es que el segundo
> procedimiento lo tenia sin el for update; me explico: pude inferir que
> si quiero trabajar con row level lock necesariamente todos los
> procedimientos que trabajen con la fila a bloquear deben tener el for
> update, para que funcione, cosa que no me parece muy logica ya que si
> yo bloqueo la fila con un procedimiento este deberia bloquear a todos
> los otros que traten de utilizar la famosa fila cosa que no pasa si en
> los otros no coloco el for update, si alguien puede aportar datos de
> por que es asi, se agradecen.

Bueno, esto debe estar explicado en la seccion de locks (es asi por
diseño, no es un error). Un simple SELECT no es bloqueado por un SELECT
FOR UPDATE. El mecanismo de locks de Postgres es algo poco ortodoxo,
pero muy flexible. Tienes que acostumbrarte :-D

> Ahora me surge otro problema (a ver si me explico mejor esta vez
> Alvaro :) ) si bien ahora la fila se bloquea, esta la obtengo de un
> order by registro(timestamp) tomo sus datos los proceso y agrego una
> fila nueva a la tabla, lo que me interesa es que el procedimiento que
> este esperando la liberacion de la fila tome la ultima fila que
> inserte y no la que estaba bloqueada anteriomente. No se si me
> explico??

Te explicas pero estoy corto de ideas. Lo malo es que cuando se
despierta y la ejecucion continua, la nueva fila aun no es visible
porque la transaccion que la ingreso no habia sido comprometida (commit)
al momento en que empezo la ejecucion de la busqueda (==> la fila no es
visible en el snapshot del select for update). Supongo que tendrias que
hacer un segundo SELECT FOR UPDATE y verificar que la nueva fila que
tiene es la misma que antes, y si no lo es, empezar de nuevo.

--
Alvaro Herrera (<alvherre[(at)]dcc(dot)uchile(dot)cl>)
"Investigación es lo que hago cuando no sé lo que estoy haciendo"
(Wernher von Braun)

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Pablo Larra 2005-04-09 03:36:44 Postgresql 7.3.4 y 8.0 en un mismo equipo.
Previous Message Juan P. Aviles 2005-04-09 02:04:36 Re: Row level lock in plpgsql