Estan en una transaccion ?

Si no hacen commit es normal que la fila no sea leida.

On 19/05/2016 6:57 PM, Ruben Fitó wrote:
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.f...@ubiquat.com
<mailto:r.f...@ubiquat.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
        Ubiquat Technologies, SL
    r.f...@ubiquat.com <mailto:j.catari...@ubiquat.com>
        www.ubiquat.com <http://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
        Ubiquat Technologies, SL
r.f...@ubiquat.com <mailto:j.catari...@ubiquat.com>
        www.ubiquat.com <http://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.

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

Responder a