Re: Fila no encontrada después de un INSERT

From: Ruben Fitó <r(dot)fito(at)ubiquat(dot)com>
To: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Fila no encontrada después de un INSERT
Date: 2016-05-19 06:57:57
Message-ID: CANiYpQwdk19PJYtFgxMDHqJ3ZJa4csUbBH=ePSda60hqPsbUiQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Me olvidaba de una cosa.

La base de datos tiene el Sistema de replicación "Streaming Replication",
pero no creemos que influya, ya que tanto el aplicativo como el backend de
la WEB se conectan al master.

Un saludo

2016-05-19 8:54 GMT+02:00 Ruben Fitó <r(dot)fito(at)ubiquat(dot)com>:

> Hola Lista,
>
> Un día mas les vengo con una duda referente a Postgresql. Qué haría sin
> ustedes...
>
> Estamos sufriendo una situación un tanto rara. Tenemos una WEB interna que
> comunica con un aplicativo son SOAP, y con la base de datos con JDBC.
>
> El pipeline para una funcionalidad en concreto que estamos siguiendo es el
> siguiente:
>
>
> 1. El backend de la WEB debe realizar una tarea iniciada por el
> usuario.
> 2. Lo primero que hace es iniciar un bloque transaccional con la base
> de datos haciendo un simple "BEGIN" (nada mas).
> 3. Conecta con el aplicativo para que procese unos datos.
> 4. El aplicativo acaba realizando un INSERT con Autocommit a una tabla
> devolviendo el id del INSERT con un RETURNING. El id es un serial.
> 5. Después, el aplicativo devuelve el id al backend de la WEB.
> 6. El backend ha de finalizar su trabajo realizando una consulta a la
> misma tabla que el aplicativa ha hecho el INSERT utilizando el id que ha
> recibido en la respuesta.
> 7. Sorprendente-mente el Backend WEB no encuentra la fila insertada
> con el id recibido del aplicativo.
>
> Para poder solucionarlo "temporalmente" hemos tenido que incluir un sleep
> de un segundo en el backend para que la fila sea encontrada.
>
> A tener en cuenta:
>
> - La WEB utiliza un POOL de conexiones que va utilizando según trabaja.
> - El aplicativo (en C + libpq) realiza una nueva conexión cada vez que
> recibe una petición del backend de la WEB y las querys se realizan con
> autocommit.
> - El tiempo transcurrido entre el INSERT del aplicativo y de la
> consulta del backend es de aproximadamente 100 milisegundos como máximo.
> - No hay triggers en la tabla que se ha hecho el INSERT.
> - Hemos simulado la operativa manualmente (consola + scripts ) y no
> hemos podido reproducir el mismo fallo.
> - Los logs de POSTGRES no nos detallan el problema.
>
>
> No hemos podido encontrar el motivo de este hecho.
>
> Nos podemos figurar varias situaciones:
>
> - Postgres devuelve el resultado del INSERT sin que se haya guardado
> físicamente en el disco. Esta teoría sólo tiene sentido cuando hemos dicho
> que el BACKEND de la WEB ha iniciado el bloque transaccional antes de que
> el aplicativo abriera una nueva conexión y ejecutara el INSERT.
> - Postgres debe de almacenar las querys en alguna caché no compartida
> ante de guardar al disco.
> - El sistema operativo tiene varias capas de almacenamiento y buffers
> que tardan en hacer efecte.
> - Configuración de shared memory.
> - Etc..
>
> Estamos teorizando y probablemente todo sean conjeturas sin sentido,
> perdón por si he dicho alguna tontería que les hace sangrar los ojos,
> jejeje.
>
> Pues eso, entendiendo que Postgres garantiza la integridad de datos, hemos
> partido de la premisa que si obtenemos el id de la fila INSERTADA es que
> postgres ha finalizado su trabajo correctamente y se garantiza que la fila
> está INSERTADA.
>
> Perdonen por el largo texto, pero no se explicarme mejor.
>
> Un saludo y gracias de antemano
>
>
>
> --
> *Ruben Fitó *
> Software Engineer
> [image: Ubiquat Technologies, SL]
> r(dot)fito(at)ubiquat(dot)com <j(dot)catarineu(at)ubiquat(dot)com>
> www.ubiquat.com
> Tota la informació continguda en aquest document i arxius adjunts és
> CONFIDENCIAL protegida per llei de secret comercial. Si l'ha rebut per
> error, si us plau elimini'l i posi's en contacte amb l'emissor.
>
> All information contained in this document and any attachments are
> CONFIDENTIAL and protected under trade secret laws. If you receive this
> message by mistake, please delete it and notify it immediately to the
> sender.
>

--
*Ruben Fitó *
Software Engineer
[image: Ubiquat Technologies, SL]
r(dot)fito(at)ubiquat(dot)com <j(dot)catarineu(at)ubiquat(dot)com>
www.ubiquat.com
Tota la informació continguda en aquest document i arxius adjunts és
CONFIDENCIAL protegida per llei de secret comercial. Si l'ha rebut per
error, si us plau elimini'l i posi's en contacte amb l'emissor.

All information contained in this document and any attachments are
CONFIDENTIAL and protected under trade secret laws. If you receive this
message by mistake, please delete it and notify it immediately to the
sender.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Eduardo Morras 2016-05-19 08:35:01 Re: Fila no encontrada después de un INSERT
Previous Message Ruben Fitó 2016-05-19 06:54:17 Fila no encontrada después de un INSERT