[Pgsql-ayuda] Invocacion de una funcion

Alvaro Herrera Munoz alvherre@dcc.uchile.cl
Wed, 13 Aug 2003 09:53:31 -0400


On Wed, Aug 13, 2003 at 08:59:13AM -0400, Edwin Quijada wrote:
> Gracias!! Mira esta solucion la he usado en muchos otros lugares, claro no
> en Postgres, pero me interesa ver tu punto de vista. Pense usar SEQUENCE
> pero el problema es que si se genera un numero y la transaccion se aborta el
> numero
> no vuleve atras. Esto es para documentos en los cuales no puede haber saltos
> en la secuencia, al menos eso fue lo que lei acerca de las secuencias. Ahora
> bien, si existe una forma de que cuando una transaccion sea cancelada esta
> no sea afectada , escucho.

No.  Podrias hacer un LOCK TABLE tabla-de-secuencias que sea obligatorio para
crear un nuevo documento y usar tu funcion.  Pero sin el LOCK, puedes meterte
en lios.

> BTW:
> Explicame porque dices que esta forma no es correcta??

Piensa lo que pasa cuando mas de una transaccion es ejecutada concurrentemente.
Has oido hablar de una "condicion de carrera" (race condition)?  En tu funcion,
hay una entre el momento en que haces el SELECT y el momento en que haces el
UPDATE.  Si nunca te ha pasado nada, es pura suerte (o has usado sistemas menos
concurrentes que Postgres, por ej. que hacen un LOCK TABLE implicitamente)

-- 
Alvaro Herrera (<alvherre[@]dcc.uchile.cl>)
"La felicidad no es maņana. La felicidad es ahora"