Re: exceptions y rollback con secuencias

From: Jaime Casanova <systemguards(at)gmail(dot)com>
To: Miguel <mmiranda(at)123(dot)com(dot)sv>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: exceptions y rollback con secuencias
Date: 2005-11-16 20:37:32
Message-ID: c2d9e70e0511161237r64754380i8c237a7afd47beaa@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On 11/16/05, Miguel <mmiranda(at)123(dot)com(dot)sv> wrote:
> Hola, he implementado una funcion que usa secuencias, incremento la
> secuencia a mitad de la funcion y al final evaluo si hubo errores,
> leyendo el manual he encontrado que a lo que se hace rollback es a lo
> que afecta las tablas de la base de datos, no asi a las variables
> manipuladas dentro de la funcion, mi pregunta es: las secuencias entran
> dentro de la primera o segunda categoria?, la secuencia es un folio asi
> que no quiero que se aumente al haber un error, para ello he hecho algo
> como esto:
>
> BEGIN
>
> BEGIN
> vpais := 'SV';
> INSERT INTO folios (pais,fecha,folio)
> VALUES (vpais,current_date,NEXTVAL('folio_sv'));
> EXCEPTION WHEN OTHERS THEN
> RAISE NOTICE 'error al insertar folio';
> PERFORM SETVAL('folio_sv',CURRVAL('folio_sv')-1);
> END;
> RETURN;
> END;
>
> En teoria si se da un error en la insercion, llave duplicada, etc, como
> el exception no me hace rollback del incremento en la secuencia
> 'folio_sv', por eso hago el perform, hasta ahora no me ha reportado
> ningun error, es esto valido y/o necesario?
> Saludos
>

imagina la siguiente secuencia:

USUARIO1: begin;
USUARIO1: insert into tabla values (nextval('secuencia'));
USUARIO1: select currval('secuencia'); -- resultado 1

USUARIO2: begin;
USUARIO2: insert into tabla values (nextval('secuencia'));
USUARIO2: select currval('secuencia'); -- resultado 2

USUARIO1: rollback;
USUARIO2: commit;

Asi que tu funcion haria que la secuencia que genero el usuario 1 se
elimine por medio de setear lasecuencia... asi que la pregunta ahora
es, que haces cuando al hacer nextval('secuencia') 2 veces mas te
genere otra vez el numero 2 y tu pk grite por llave duplicada?

solucion, deja las huecos en la secuencia no le hacen daño a nadie, si
quieres una secuencia sin huecos usa una tabla de secuencias y
bloqueala antes de sacar una secuencia...

--
Atentamente,
Jaime Casanova
(DBA: DataBase Aniquilator ;)

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Miguel 2005-11-16 20:43:27 Re: exceptions y rollback con secuencias
Previous Message Miguel 2005-11-16 20:23:17 exceptions y rollback con secuencias