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: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Row level lock in plpgsql
Date: 2005-04-08 19:46:09
Message-ID: 20050408194609.GA19299@dcc.uchile.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Thu, Apr 07, 2005 at 07:44:35PM +0200, Juan P. Aviles wrote:

> "no me funciono" : Lo que hago ha manera de prueba es en un
> procedimiento:
>
> Select into reg * from tabla1 where prod='prod1' order by registro for
> update; para obtener los valores de la fila que quiero bloquear. y su
> posterior Insert en la misma tabla con los datos nuevos y en otro
> procedimiento hago lo mismo salvo que entre el select y el insert hago
> un loop de un cierto tiempo. Despues llamo al segundo procedimiento y
> luego al primero cosa que el segundo se quede en el loop (con la fila
> bloqueada supuestamente por el for update) y luego lanzo el primer
> procedimiento, pero, este me afecta de inmediato la fila sin tomar en
> cuenta el bloqueo. Es es lo que no me funciona. :)

No entendi para nada tu procedimiento. Que tal si muestras el codigo?

> En ningun caso he probado la forma que tu sugieres con perform
> me puedes dar mas datos acerca de esto, de todas maneras lo voy
> a probar de inmediato.

Eso no afecta en nada.

> Tendra algo que ver que trabajo con autocommit desde python ????

DOH!!!! El SELECT FOR UPDATE solo bloquea durante la transaccion que lo
encierra. Si no has iniciado una transaccion (y particularmente si
tienes "autocommit" activado, que es el modo normal en Postgres)
entonces la transaccion termina inmediatamente y por lo tanto el lock se
libera.

Si quieres que el lock persista, tienes que encerrar las operaciones en
una transaccion (BEGIN/COMMIT)

> Tengo entendido que cualquier procedimiento que yo llame desde python
> o desde cualquier lenguaje automaticamente inicia una transaccion y
> hace un commit si esta termina bien o un rollback si termina mal.

No exactamente, pero algo parecido.

--
Alvaro Herrera (<alvherre[(at)]dcc(dot)uchile(dot)cl>)
Y una voz del caos me habló y me dijo
"Sonríe y sé feliz, podría ser peor".
Y sonreí. Y fui feliz.
Y fue peor.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2005-04-08 19:54:29 Re: Macros
Previous Message Jessie Cordoba 2005-04-08 19:40:34 SERVIDOR PORTGRESQL 8.0