Re: Postgresql 8.4.3 Error idle in transaccion

From: Espartano <espartano(dot)mail(at)gmail(dot)com>
To: Jaime Casanova <jaime(at)2ndquadrant(dot)com>
Cc: ruben avila galindo <ruben2218(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Postgresql 8.4.3 Error idle in transaccion
Date: 2011-11-14 22:35:11
Message-ID: CAJaC6KZObV_k8DEhDwkdK+TUTs+Dc6P9s3Ag7ikHx498LTi-VQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2011/11/9 Jaime Casanova <jaime(at)2ndquadrant(dot)com>:
> 2011/11/9 ruben avila galindo <ruben2218(at)gmail(dot)com>:
>> idle in transaction
>>
>
> IDLE significa que esta esperando algo (en este caso a que le digas que hacer).
> IN TRANSACTION significa que abriste una transacción que nunca cerraste.
>
> y no, postgres no debe cerrar las conexiones automaticamente y mucho
> menos una que tenga una transaccion abierta. El programador abrio la
> conexion y la transaccion y es la responsabilidad del programador
> cerrar ambas
>

Hola Jaime, antes que nada un saludo, tengo algunas dudas relacionadas
con este tema (debido a que tengo un escenario de idle transaction)

las dudas son las siguientes:

1.- Entiendo que cuando se utiliza una función de plpgsql hay un begin
y commit implícitos, es posible que una transacción se quede en "idle
in transaction" si se esta ejecutando un reindex o vacuum full en la
tabla que tiene un foreign key y que hace referencia a la tabla donde
la función plpgsql esta haciendo un update o un insert ?

es decir, yo quiero hacer unsert o update en la tabla A, pero la tabla
A tiene un foreign key hacia la tabla B y en la tabla B hay un proceso
reindex o vacuum full.

2.- En el mail que has enviado anteriormente mencionas que postgresql
no cierra automaticamente las conexiones, la pregunta es, esto no
suceda bajo ninguna circunstancia ? ni siquiera cuando postgresql no
detecta tráfico en una conexión/sesión por un tiempo determinado?

esta pregunta la hago porque actualmente estoy revisando un problema
en una aplicación que han desarrollado en donde trabajo, (no poseo el
código fuente) el comportamiento es el siguiente:

La aplicación abre una conexión hacia postgresql cuando arranca (es un
daemon) y por lo visto la mantiene abierta por un tiempo indeterminado
debido a que realiza updates contantes (existen horas en las que debe
tener muy poca actividad) en algunas ocaciones los logs de dicha
aplicación marcan un error -400:

-400 (ECPG_PGSQL) con la siguiente descripción:

sqlerrm:'no connection to the server

después del error inicial la aplicación sigue marcando el mismo error
una y otra vez cuando intenta hacer un insert a travez de una fucion
plpgsql, (entiendo que el problema es la aplicación puesto que nunca
cierra la conexión hacia la base de datos y aun habiendo detectado
este problema no la cierra en intenta reconectar hacia la db) el
problema es que los desarrolladores argumentan que este es un error de
postgresql no de su aplicación y debo demostrar lo contrario.

La version de postgresql que se esta utilizando es 8.3

PD: La aplicación realiza un vacuum full cada x tiempo aproximadamente
cada 15 inserts o 1 hora, entiendo que esto tampoco es correcto y el
vauum debería ser mediante auto-vacuum, estoy en proceso de convencer
a los des arrolladores de este tema, y creo que tal vez pueda estar
relacionado con los estados "idle in transaction"

Cualquier comentario lo agradezco mucho.

Gracias.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Gunnar Wolf 2011-11-14 22:49:51 Re: Paquetes básicos de instalación de Postgresql en Debian 6.0
Previous Message Martín Marqués 2011-11-14 18:56:14 Re: replicacion por stream de WAL