Re: Fila no encontrada después de un INSERT

From: Eduardo Morras <emorrasg(at)yahoo(dot)es>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Fila no encontrada después de un INSERT
Date: 2016-05-19 08:35:01
Message-ID: 20160519103501.b1f297711fee9264ad133412@yahoo.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Thu, 19 May 2016 08:54:17 +0200
Ruben Fitó <r(dot)fito(at)ubiquat(dot)com> wrote:

> 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.

Resumiendo si lo he entendido bien:

Transaccion A

BEGIN
BEGIN
INSERT
AUTOCOMMIT
BEGIN
INSERT
AUTOCOMMIT
BEGIN
INSERT
AUTOCOMMIT
....
No hay COMMIT para el BEGIN inicial

Al hacer un SELECT no puedes leer los datos guardados ya que no han sido realmente guardados.

Que es lo que quieres hacer? Que permanezcan los datos en la BD? Haz el COMMIT final. Que no permanezca pero poder consultarlos? Define la tabla para que pueda ser leida por readers y haz un ROLLBACK al final, si no son muchos datos es mas rapido que crear una tabla temporal y hacerle un drop posterior.

> 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.

--- ---
Eduardo Morras <emorrasg(at)yahoo(dot)es>

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Horacio Miranda 2016-05-19 08:44:01 Re: Re: Fila no encontrada después de un INSERT
Previous Message Ruben Fitó 2016-05-19 06:57:57 Re: Fila no encontrada después de un INSERT