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: Fila no encontrada después de un INSERT
Date: 2016-05-19 06:54:17
Message-ID: CANiYpQy+QM6a5QT=oGN_vfoAPdz9qv-Rj9EVqwGdXnR=WDCTHw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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.

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Ruben Fitó 2016-05-19 06:57:57 Re: Fila no encontrada después de un INSERT
Previous Message Alvaro Herrera 2016-05-19 03:10:52 Re: Re: [pgsql-es-ayuda] Recuperación de error en BD.