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-06 21:37:39
Message-ID: 20050406213738.GA24554@dcc.uchile.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Wed, Apr 06, 2005 at 10:20:58PM +0200, Juan P. Aviles wrote:

> Mi duda era , que pasa si dos procediemientos llegan al mismo tiempo a
> la parte del select con un mismo producto?, segun las pruebas que hice
> ambos toman el mismo valor de reg.saldo_total, y queda la escoba .
>
> Lo que necesito es bloquear la fila que me devuelve el select hasta
> que haga el incremento o disminucion y el posterior insert en la tabla
> , estuve leyendo la documentacion y me encontre con row level lock que
> es posible utilizando el select for update, lo probe y no me funciono.

Define "no me funciono". Aca funciona perfectamente:

alvherre=# create table a (foo int);
CREATE TABLE
alvherre=# insert into a values (1);
INSERT 17311 1
alvherre=# create function asd (int ) returns void language plpgsql as
$$ begin perform * from a where foo=$1 for update; return; end$$;
CREATE FUNCTION
alvherre=# begin;
BEGIN
alvherre=# select asd(1);
asd
-----

(1 fila)

En otra sesion:

alvherre=# select asd(1);

se queda bloqueado hasta que haga commit en la primera.

> Busque en internet y me encontre ha alguien que dice que no se pueden
> hacer select for update en plpgsql.

Esta equivocado.

--
Alvaro Herrera (<alvherre[(at)]dcc(dot)uchile(dot)cl>)
"En las profundidades de nuestro inconsciente hay una obsesiva necesidad
de un universo lógico y coherente. Pero el universo real se halla siempre
un paso más allá de la lógica" (Irulan)

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2005-04-06 21:40:24 Re: postgres no funciona
Previous Message Julio Rivero 2005-04-06 21:27:31 Suscribe to pgsql-es-ayuda