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

From: Ruben Fitó <r(dot)fito(at)ubiquat(dot)com>
To: Eduardo Morras <emorrasg(at)yahoo(dot)es>
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-19 10:16:45
Message-ID: CANiYpQxZCaDRGgLsaycyU+20_C73jHWt6EP0yhuaA4jLepZuYw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

jajajaj, como siempre me explico fatal.

Expongo un mini esquema del pipeline:

*BACKEND WEB (JAVA-JDBC)* *Aplicación en C* *Anotaciones*
Tiene varias conexiones permanentes

Inicia un bloque transaccional con BEGIN

Inicia una petición SOAP

Inicia proceso de la petición del backend

Abre una nueva conexión con la base de datos Libreia libpq

Hace un INSERT sin (BEGIN). Pqexec() + Pqclear() Hemos comprobado que la
fila se inserta. Por lo tanto el autocommit hace su función. Lo que no
sabemos es si es instantáneo.

La base de datos le devuelve el valor del ID de la fila. El ID es un serial.

Cierra la conexión con la base de datos.

Devuelve el ID al backend
Con el ID hace una busqueda en la misma tabla
Postgres responde que no encuentra la fila

Si incluimos un sleep(1) antes de ejecutar la query
SI que la encuentra. Vaya añadimos un lag de un segundo.

Como pueden ver son conexiones diferentes, bloques transaccionales
diferentes, programas diferentes.
Por lo tanto cuando el backend hace la consulta debería encontrar la fila.
Hemos intentado simular este mismo pipeline manualmente desde psql/scripts
y no hemos podido reproducir esta situación.

Podría incluir que el backend hace un rollback si NO encuentra la fila y un
commit si la encuentra, pero creo que esto es irrelevante para este caso.

Espero se entienda. jejeje

Un fuerte saludo

2016-05-19 10:35 GMT+02:00 Eduardo Morras <emorrasg(at)yahoo(dot)es>:

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

--
*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 Horacio Miranda 2016-05-19 10:37:44 Re: Re: [pgsql-es-ayuda] Fila no encontrada después de un INSERT
Previous Message Eduardo Morras 2016-05-19 10:12:58 Re: Fila no encontrada después de un INSERT