Re: Lock menos restrictivo

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Gustavo <gustavor(at)intercomgi(dot)net>
Cc: PostgreEs <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Lock menos restrictivo
Date: 2007-04-18 12:48:18
Message-ID: 20070418124818.GA3836@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Gustavo escribió:

> CREATE OR REPLACE FUNCTION "servicio"."alta_maquina" (id_usr bigint, nombre_maquina varchar) RETURNS bigint AS
> $body$
> DECLARE
> id_maquina bigint;
> BEGIN
> SELECT servicio.vista_maquina.id_recurso INTO id_maquina FROM servicio.vista_maquina WHERE servicio.vista_maquina.id_usuario=id_usr AND servicio.vista_maquina.nombre=nombre_maquina;
> IF NOT FOUND THEN
> INSERT into servicio.vista_maquina (id_usuario,nombre,cant_versiones_completas) values (id_usr,nombre_maquina,1);
> RETURN currval('servicio.recurso_id_recurso_seq'::text::regclass);
> ELSE
> RETURN id_maquina;
> END IF;
> END
> $body$
> LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
>
> Ahora puede suceder que si varias transacciones ejecutan en simultaneo
> la funcion tenga problemas de insercion duplicada. Que tengo que
> hacer? Lock a nivel de tabla?. Estoy tratando de poner el lock menos
> restrictivo porque se espera mucho trafico en la fucncon y quiero
> evitar un cuello de botella. Cualquier sugerencia será bienvenida.

Lo que puedes hacer es envolver el INSERT en un bloque
BEGIN/END/EXCEPTION, que capture el error, y que cuando se produzca
vuelva a intentar el SELECT y te devuelva el ID recien insertado en otra
transaccion.

Hay un ejemplo de algo parecido (no es lo mismo realmente, pero la idea
basica esta ahi) en la documentacion. Creo que es un ejemplo en el
capitulo de plpgsql sobre exceptions, la funcion se llama algo con
"upsert".

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2007-04-18 12:56:46 Re: sobre tipos de datos JDBC y Postgres
Previous Message Gustavo 2007-04-18 11:32:48 Lock menos restrictivo