From: | "Ing(dot) Eris J(dot) Gomez" <eris_jose(at)hotmail(dot)com> |
---|---|
To: | <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Transacciones en PG |
Date: | 2008-04-30 15:47:34 |
Message-ID: | BAY131-DS15BF8B77E3F810409118E8ED80@phx.gbl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Gracias por su ayuda. A continuación les envío parte del código que realiza una transacción minima.
Tengo esta funcion en PostgreSql:
Función PlpGSql
-----------------------------------------
CREATE OR REPLACE FUNCTION "public"."generar_secuencia" (_compania varchar, tabla varchar, tipdoc varchar, origen char, actualizar integer) RETURNS integer AS
DECLARE
cantidad integer;
secue_sec2 varchar(15);
tipdoc_sec2 varchar(15);
origen_sec2 varchar(15);
campocia_sec2 varchar(15);
cont integer;
secuencia integer;
cur record;
BEGIN
--insertando el registro en caso de que no exista
select into cantidad count(*) from clasecue where codcia_sec=_compania
and nomtab_sec=tabla and tipdoc_sec=tipdoc and origen_sec=origen;
if cantidad=0 --si en la tabla de secuencias no existe un registro para la tabla especificada, con el tipo de documento especificado
then
--consultando los nombres de los campos que voy a buscar en la tabla para generar la secuencia
select into secue_sec2,tipdoc_sec2,origen_sec2,campocia_sec2,cont
secue_sec,tipdoc_sec,origen_sec,campocia_sec,count(*)
from claconse where nomtab_sec=tabla
group by secue_sec,tipdoc_sec,origen_sec,campocia_sec;
if cont>0 --si la tabla claconse tiene tiene informacion sobre la tabla a la que se le va a generar la secuencia, busco la secuenca actual de esa tabla-
then
--buscando la ultima secuencia de la tabla
if origen_sec2>'' --si la tabla maneja origen
then
for cur in execute 'select max('||secue_sec||')as secuencia from '
||tabla||' where '||campocia_sec||'='''||_compania||''' and '||tipdoc_sec||'='''||tipdoc
||''' and '||origen_sec||'='''||origen||''''
loop
secuencia=cur.secuencia;
end loop;
else
for cur in execute 'select max('||secue_sec||')as secuencia from '||tabla||' where '||campocia_sec||'='''
||_compania||''' and '||tipdoc_sec||'='''||tipdoc||''''
loop
secuencia=cur.secuencia;
end loop;
end if;
if secuencia is null
then
secuencia=0;
end if;
else --de la contrario, devuelvo secuencia 0 ya que no tengo suficiente informacion para generar la secuencia
secuencia=0;
end if;
--se inserta en la tabla de secuencias un registro para la tabla y el tipo de documento especificado
insert into clasecue (codcia_sec,nomtab_sec,tipdoc_sec,origen_sec,numdoc_sec)
values (_compania,tabla,tipdoc,origen,secuencia);
end if;
-------------------------------------------------------------------------------
if actualizar=1
then
--actualizando la secuencia de la tabla especificada
update clasecue set numdoc_sec=numdoc_sec+1 where codcia_sec=_compania and nomtab_sec=tabla
and tipdoc_sec=tipdoc and origen_sec=origen;
end if;
--buscando la secuencia generada para que la aplicacion que llame esta funcion, la tome
select into secuencia numdoc_sec+1 from clasecue where codcia_sec=_compania and
nomtab_sec=tabla and tipdoc_sec=tipdoc and origen_sec=origen;
return secuencia;
END;
Ahora bien:
En el frontend ejecuto el siguiente codigo:
Transaccion(1) // Esto me inicia una transaccion en PostgreSql
camposecuencia = invocar_secuencia_PG(parametros)
Inserto los datos del header
inserto los datos del detalle
Transaccion(3) //Commit de la transaccion
Ya me ocurrio que varios usuarios casi al mismo tiempo ejecutaron el proceso y se perdio una secuencia.
Creen que haya algo malo en esta funcion?
Gracias nuevamente.
Attachment | Content-Type | Size |
---|---|---|
Ing. Eris J. Gomez.vcf | application/octet-stream | 215 bytes |
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2008-04-30 15:58:17 | Re: Transacciones en PG |
Previous Message | Javier Elizalde | 2008-04-30 15:46:13 | Consumo de memoria |