Re: Actualizar fila y controlar concurrencia

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: iNFO <info(at)pgsistemasmdq(dot)com(dot)ar>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Actualizar fila y controlar concurrencia
Date: 2011-08-19 15:02:16
Message-ID: 1313765973-sup-294@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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 <alvherre(at)alvh(dot)no-ip(dot)org>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jose David Verbel Tous 2011-08-19 15:35:05 Problemas con pgpool
Previous Message iNFO 2011-08-19 14:32:00 Actualizar fila y controlar concurrencia