RE: Transacciones en PG

From: Henry <hensa22(at)yahoo(dot)es>
To: Edwin Quijada <listas_quijada(at)hotmail(dot)com>, "Ing(dot) Eris J(dot) Gomez" <eris_jose(at)hotmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: RE: Transacciones en PG
Date: 2008-05-03 13:09:14
Message-ID: 557973.82740.qm@web30804.mail.mud.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


--- Edwin Quijada <listas_quijada(at)hotmail(dot)com>
escribió:

>
> Como te dijo Alvaro eso esta todo malo.
> Si no te gusta el campo serial otra forma seria:
>
> una tabla de secuencias con tipo de docuemntos y
> bloquea esa tabla al momento de pedir la secuencia
> seria algo asi
> Pseudocodigo
>
> CREATE FUNCION secuecnia(varchar tipo) as Intreger
> Return
> $$body$$
> LOCK TABLE(seceucnia)
> select into se sec+1 from secuecnia where
> tipo=$1;
> if (found)
> update secuencia set sec=se where tipo=$1;
> return(se);
> else
> insert into secuecnia values($1,1);
> return(1);
> end if;
>
> Seria algo asi. Eso lo he usado toda mi vida con
> excelentes resultados. La tabla se desbloquea sola
> al terminar la transaccion.
>
>
>
*-------------------------------------------------------*
> *-Edwin Quijada
> *-Developer DataBase
> *-JQ Microsistemas
> *-809-849-8087
>
> * " Si deseas lograr cosas excepcionales debes de
> hacer cosas fuera de lo comun"
>
*-------------------------------------------------------*
>
>
> ________________________________
> From: eris_jose(at)hotmail(dot)com
> To: pgsql-es-ayuda(at)postgresql(dot)org
> Subject: Re: [pgsql-es-ayuda] Transacciones en PG
> Date: Wed, 30 Apr 2008 11:47:34 -0400
>
>
>
>
>
>
>
>
> 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
>
=== message truncated ===

Si usas esa logica, porque mejor de bloquear la tabla
solamente bloqueas el registro para que no retrase el
proceso de los otros tipo de documentos,
podria se mas liviano el proceso

Saludos

______________________________________________
Enviado desde Correo Yahoo! La bandeja de entrada más inteligente.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Martin Marques 2008-05-03 17:05:36 Re: WAL - Momento de escritura a disco
Previous Message Arlen Tamayo Labrada 2008-05-03 04:34:37