Re: [pgsql-es-ayuda] Fila no encontrada después de un INSERT

From: Jaime Casanova <jaime(dot)casanova(at)2ndquadrant(dot)com>
To: Ruben Fitó <r(dot)fito(at)ubiquat(dot)com>
Cc: "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: [pgsql-es-ayuda] Fila no encontrada después de un INSERT
Date: 2016-05-23 16:08:29
Message-ID: CAJGNTeNQxLj3+rQRHnYjHUF1CP2bKwb_D0LQB=-qV2TzP8xC4g@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2016-05-19 1:54 GMT-05:00 Ruben Fitó <r(dot)fito(at)ubiquat(dot)com>:
>
> El backend de la WEB debe realizar una tarea iniciada por el usuario.
> Lo primero que hace es iniciar un bloque transaccional con la base de datos haciendo un simple "BEGIN" (nada mas).
> Conecta con el aplicativo para que procese unos datos.

Cuando dices conecta con el aplicativo, significa nada que ver con la
base, no ejecutas SELECT ni nada?

> El aplicativo acaba realizando un INSERT con Autocommit a una tabla devolviendo el id del INSERT con un RETURNING. El id es un serial.

Esta conexión es la misma que ejecuto el BEGIN?

> Después, el aplicativo devuelve el id al backend de la WEB.
> 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.
> Sorprendente-mente el Backend WEB no encuentra la fila insertada con el id recibido del aplicativo.
>

la situación, como han tratado de explicarte parecería que:

tienes dos conexiones a la base: la del backend WEB y la del aplicativo
para que esta situación ocurra debes tener el asilamiento del backend
WEB seteado a serializable o repeteable read
(mira el párametro default_transaction_isolation), pero también debe
ocurrir que después de un segundo cierras la
conexión del backend WEB de lo contrario no vería nunca el nuevo registro.

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

que POOL especificamente?

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

si, eso es correcto (a menos que...)
podrías mostrar el comando INSERT exacto que estás usando?

o mejor aún, en un momento en que garantices que nada más intervendrá, haz esto:

en postgresql.conf:

log_line_prefix='%t pid=%p, line=%l, xid=%x, db=%d, user=%u '
log_statement=all

luego en psql, ejecuta:
select pg_reload_conf();
esto es para que vea los cambios en la configuración (o si puedes
reiniciar todo mejor aun, no es necesario para el postgres pero me
asegura que no hayan conexiones ya establecidas molestando mi prueba.

Finalmente, haz el proceso que mencionas. y pasanos la parte del log
desde el reload hasta el final.

luego puedes dejar los parametros en el log como los tenías (no
olvides de recargar con pg_reload_conf())

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

lo siento, esta lista de correo es publica, abierta y libremente
consultable... de hecho hay un archivo de ella (y varias copias de los
archivos en varios lugares).
nada de lo que escribas aquí será CONFIDENCIAL

--
Jaime Casanova www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

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

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2016-05-23 16:57:14 Re: Re: [pgsql-es-ayuda] Fila no encontrada después de un INSERT
Previous Message Maria Antonieta Ramirez 2016-05-23 14:49:33 ELIIMINAR LLAVE FORANEA