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 ;)
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 |