Hola, soy bastante nuenvo en Postgres y a los golpes he logrado armar
un programa de facruracion que funcion super bien.
Ahora quiero solucionar el tema de concurrencia cuando hago alguna
actualizaciones y no logro hacerlo.

el escenartio es el siguiente

Tengo una tabla "Comprobantes" donde guardo el ultimo numero impreso del
comprobante segun corresponda al punto de venta y letra:

el:

pto_venta letra ult_num
5 A 100
5 B 50
4 A 10
4 B 23

en el progama al momento de grabar la factura acceso esta table, tomo el
numeor les sumo 1 y lo vuelvo a guardar

se dan lo casos en que desde mas de un pc les asigan el mismo nro.

estuve viendo por ahi el tema de "select ... for update" para bloquear ,
trasacciones,etc

Por favor si me pueden orienta y tirarme unos tipr para investigar seria
buenisismo

pablo

Search Discussions

  • Alvaro Herrera at Aug 19, 2011 at 3:02 pm

    Excerpts from iNFO's message of vie ago 19 10:32:00 -0400 2011:
    Hola, soy bastante nuenvo en Postgres y a los golpes he logrado armar
    un programa de facruracion que funcion super bien.
    Ahora quiero solucionar el tema de concurrencia cuando hago alguna
    actualizaciones y no logro hacerlo.

    el escenartio es el siguiente

    Tengo una tabla "Comprobantes" donde guardo el ultimo numero impreso del
    comprobante segun corresponda al punto de venta y letra:

    el:

    pto_venta letra ult_num
    5 A 100
    5 B 50
    4 A 10
    4 B 23

    en el progama al momento de grabar la factura acceso esta table, tomo el
    numeor les sumo 1 y lo vuelvo a guardar

    se dan lo casos en que desde mas de un pc les asigan el mismo nro.

    estuve viendo por ahi el tema de "select ... for update" para bloquear ,
    trasacciones,etc
    Eso mismo. Abres una transacción (BEGIN) luego haces un SELECT FOR
    UPDATE del registro que quieres incrementar, luego le das el UPDATE,
    luego commit. Este procedimiento asegura que nadie obtendrá el mismo
    número.

    Observa que desde el SELECT FOR UPDATE y hasta COMMIT, otra sesión
    tratando de obtener lock sobre el mismo registro quedará bloqueado.
    (Lo cual es razonable)

    --
    Álvaro Herrera <[email protected]>
  • Edwin Quijada at Aug 20, 2011 at 2:48 pm
    Alvaro, esta semana me paso algo interesante con eso. Tengo una funcion que hace exactamente eso bloque el record , luego el update, bien hasta ahi, lo raro es que puse dicha funcion dentro de un trigger para generar dicha secuencia pero al hacer un insert todo se queda bloqueado y el inserrt nunca prospera pero si dentro del insert invoco a la funcion no hay problema solo al ponerla dentro del trigger.Algo extrano, nunca me habia dado cuenta porque siempre la uso , la funcion, desde la aplicacion.

    *-------------------------------------------------------*
    *-Edwin Quijada
    *-Developer DataBase
    *-JQ Microsistemas

    *-Soporte PostgreSQL

    *-www.jqmicrosistemas.com
    *-809-849-8087
    *-------------------------------------------------------*


    CC: [email protected]
    Subject: Re: [pgsql-es-ayuda] Actualizar fila y controlar concurrencia
    From: [email protected]
    To: [email protected]
    Date: Fri, 19 Aug 2011 11:02:16 -0400

    Excerpts from iNFO's message of vie ago 19 10:32:00 -0400 2011:
    Hola, soy bastante nuenvo en Postgres y a los golpes he logrado armar
    un programa de facruracion que funcion super bien.
    Ahora quiero solucionar el tema de concurrencia cuando hago alguna
    actualizaciones y no logro hacerlo.

    el escenartio es el siguiente

    Tengo una tabla "Comprobantes" donde guardo el ultimo numero impreso del
    comprobante segun corresponda al punto de venta y letra:

    el:

    pto_venta letra ult_num
    5 A 100
    5 B 50
    4 A 10
    4 B 23

    en el progama al momento de grabar la factura acceso esta table, tomo el
    numeor les sumo 1 y lo vuelvo a guardar

    se dan lo casos en que desde mas de un pc les asigan el mismo nro.

    estuve viendo por ahi el tema de "select ... for update" para bloquear ,
    trasacciones,etc
    Eso mismo. Abres una transacción (BEGIN) luego haces un SELECT FOR
    UPDATE del registro que quieres incrementar, luego le das el UPDATE,
    luego commit. Este procedimiento asegura que nadie obtendrá el mismo
    número.

    Observa que desde el SELECT FOR UPDATE y hasta COMMIT, otra sesión
    tratando de obtener lock sobre el mismo registro quedará bloqueado.
    (Lo cual es razonable)

    --
    Álvaro Herrera <[email protected]>
    -
    Enviado a la lista de correo pgsql-es-ayuda ([email protected])
    Para cambiar tu suscripci�n:
    http://www.postgresql.org/mailpref/pgsql-es-ayuda
  • Alvaro Herrera at Aug 22, 2011 at 4:44 pm

    Excerpts from Edwin Quijada's message of sáb ago 20 10:47:52 -0400 2011:

    Alvaro, esta semana me paso algo interesante con eso. Tengo una funcion que hace exactamente eso bloque el record , luego el update, bien hasta ahi, lo raro es que puse dicha funcion dentro de un trigger para generar dicha secuencia pero al hacer un insert todo se queda bloqueado y el inserrt nunca prospera pero si dentro del insert invoco a la funcion no hay problema solo al ponerla dentro del trigger.Algo extrano, nunca me habia dado cuenta porque siempre la uso , la funcion, desde la aplicacion.
    ¿Qué hace la función?

    --
    Álvaro Herrera <[email protected]>
  • Edwin Quijada at Aug 22, 2011 at 5:32 pm
    Aqui esta :::
    CREATE OR REPLACE FUNCTION "public"."get_secuencia" (varchar, concat boolean) RETURNS varchar AS$body$DECLARE tipodoc ALIAS FOR $1; secuencia int4; registro record;BEGIN
    /*-----------------------------------------------------------------------------------------*/ secuencia :=1; select into registro * from t_secuencias where f_tipo_documento = tipodoc for update;
    IF NOT FOUND THEN INSERT INTO t_secuencias (f_tipo_documento, f_secuencia) VALUES (tipodoc,secuencia); ELSE secuencia:= registro.f_secuencia+secuencia; UPDATE t_secuencias SET f_secuencia = secuencia WHERE f_tipo_documento = tipodoc; END IF;
    if concat then return tipodoc||trim(both ' ' from (to_char(secuencia,'0000000')));else return trim(both ' ' from (to_char(secuencia,'0000000'))); end if; END;$body$LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
    *-------------------------------------------------------*
    *-Edwin Quijada
    *-Developer DataBase
    *-JQ Microsistemas

    *-Soporte PostgreSQL

    *-www.jqmicrosistemas.com
    *-809-849-8087
    *-------------------------------------------------------*


    CC: [email protected]; [email protected]
    Subject: RE: [pgsql-es-ayuda] Actualizar fila y controlar concurrencia
    From: [email protected]
    To: [email protected]
    Date: Mon, 22 Aug 2011 13:43:52 -0300

    Excerpts from Edwin Quijada's message of sáb ago 20 10:47:52 -0400 2011:
    Alvaro, esta semana me paso algo interesante con eso. Tengo una funcion que hace exactamente eso bloque el record , luego el update, bien hasta ahi, lo raro es que puse dicha funcion dentro de un trigger para generar dicha secuencia pero al hacer un insert todo se queda bloqueado y el inserrt nunca prospera pero si dentro del insert invoco a la funcion no hay problema solo al ponerla dentro del trigger.Algo extrano, nunca me habia dado cuenta porque siempre la uso , la funcion, desde la aplicacion.
    ¿Qué hace la función?

    --
    Álvaro Herrera <[email protected]>
    -
    Enviado a la lista de correo pgsql-es-ayuda ([email protected])
    Para cambiar tu suscripci�n:
    http://www.postgresql.org/mailpref/pgsql-es-ayuda

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppgsql-es-ayuda @
categoriespostgresql
postedAug 19, '11 at 2:39p
activeAug 22, '11 at 5:32p
posts5
users3
websitepostgresql.org.es
irc#postgresql

People

Translate

site design / logo © 2023 Grokbase