Re: Update concurrente

From: Olivier Gautherot <ogautherot(at)gautherot(dot)net>
To: Silvio Bravo Cadó <bravocado(at)gmail(dot)com>
Cc: postgre sql <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Update concurrente
Date: 2019-12-05 08:07:02
Message-ID: CAJ7S9TXZUKSX_CkDksG+47n=jA1JybSMFkKfVKyijPvcsV+CXA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola Silvio,

El jue., 5 de diciembre de 2019 02:46, Silvio Bravo Cadó <
bravocado(at)gmail(dot)com> escribió:

> Hola lista,
> Espero se encuentren muy bien, les escribo porque tengo una duda con
> respecto a si estoy realizando bien las actualizaciones en una tabla o tal
> vez sea algo del diseño de la solución.
> Tengo una tabla A que busca llevar el inventario de productos, que podría
> describirse así:
>
> Id int
> nombre text
> precio numeric(8,2)
> cantidad int
> disponibilidad int
>
> Cada vez que se crea un nuevo registro se define la cantidad y la
> disponibilidad que son las mismas. También se tiene un check constraint
> donde cantidad >= disponibilidad.
>
> Por otro lado cuando se tiene otra tabla B que representa las compras:
>
> Id int
> producto_id int
>
> Cada vez que se agrega un registro en B se ejecuta un trigger que hace un
> update a A para restar disponibilidad con un: UPDATE A SET disponibilidad =
> disponibilidad - 1 WHERE id = New.id
>
> El problema es que estas tablas pueden tener mucha concurrencia, muchos
> usuarios finales intentando comprar y por temporalidad compran el mismo
> producto y cuando hay picos de usuarios el update puede llegar a tardar
> hasta 60 segundos o mas en completarse.
>
> Mi duda es si hay alguna forma de mejorar el rendimiento de este update.
>

Primero, quieres asegurar la consistencia de la base y me imagino que
ejecutas el INSERT y el UPDATE en una transacción.

Si tienes muchos accesos concurrentes a la misma fila, seguro que se van a
encolar. Algunas preguntas:

1. Cuántas filas tiene la tabla A?
2. Sólo para validar: tienes una llave primaria sobre el campo id?
3. Cuántas columnas y cuántos índices tiene la tabla real?
4. Cuántos usuarios concurrentes puedes tener?

Como idea loca, podrías simular varios productos (digamos 4) que se
reparten el stock completo y cada vez que llega un pedido se resta del
stock de uno al azar?

Olivier

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Silvio Bravo Cadó 2019-12-05 17:56:09 Re: Update concurrente
Previous Message Silvio Bravo Cadó 2019-12-05 01:46:15 Update concurrente