2016-05-19 1:54 GMT-05:00 Ruben Fitó <r.f...@ubiquat.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@postgresql.org) Para cambiar tu suscripci�n: http://www.postgresql.org/mailpref/pgsql-es-ayuda