Re: Duda conceptual sobre locks en PostgreSQL

From: "Gustavo" <gustavor(at)intercomgi(dot)net>
To: "Agustin Casiva" <casivaagustin(at)gmail(dot)com>, "PostgreEs" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Duda conceptual sobre locks en PostgreSQL
Date: 2007-08-18 14:25:10
Message-ID: 007d01c7e1a3$97051500$e802a8c0@Maquina
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Agustin, gracias por tu ayuda, al final despues de 2 dias de busqueda
encontre la causa. Dejo la explicacion de cual era el problema para que
quede en el historial de la lista,

El problema venia porque habia 2 funciones que dentro de la cantidad de
cosas que hacian actualizaban dos registros en distintos orden.Es decir:

Funcion 1:

UPDATE registro1
UPDATE registro 2

Funcion 2:

UPDATE registro 2
UPDATE registro 1

Leyendo en el manual, vi que cuando una transaccion hace un UPDATE sobre una
fila, la bloquea hasta que termina la transaccion, con lo cual cuando le
estaba haciendo test de carga a la BD, y justo sucedia que la fucnion 1
ejecutaba el primer update y la funcion 2 ejecutaba tambien el primer update
antes de que la funcion1 ejecute el segundo update, las transacciones
quedaban en estado de deadlock.

La solucione serializando el aceso a estos registros compartidos por las
transacciones, es decir que ambas funciones actualizen primero el registro1
y luego el registro 2

Saludos

Gustavo

----- Original Message -----
From: "Agustin Casiva" <casivaagustin(at)gmail(dot)com>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Sent: Saturday, August 18, 2007 11:02 AM
Subject: Re: [pgsql-es-ayuda] Duda conceptual sobre locks en PostgreSQL

On 8/15/07, Gustavo <gustavor(at)intercomgi(dot)net> wrote:
>
>
> Buenas lista
>
> Tengo el siguiente problema. Estoy desarrollando una aplicacion que invoca
> a
> funciones definidas en la BD y luego de andar un rato, me tira un deadlock
> y
> no se bien porque. me late que viene por un SELECT .. FOR UPDATE que tengo
> definido en una funcion.
>
> Lo uso asi:
>
>
> //Busco bloquear una fila de la tabla para que otra transaccion no obtenga
> el mismo id
> SELECT contador_actual FROM tabla_contador WHERE id_usr=xx FOR UPDATE;
>
> ..// Hago inserciones en una tabla usando el contador que obtuve
>
> //Actualizo el contador
> UPDATE tabla_contador SET
> contador_actual=contador_actual+1 WHERE id_usr=xx;
>
>
> Esta bien usado? hay alguna otra forma de hacer esto?( creo que las
> secuencias no se adaptarian para este caso)
>

Podrías pasar el codigo completo de la función para ver el orden de
las consultas de inserción y acutalización, y la definición de las
tablas.

> Existe alguna forma de detectar como sucedio el deadlock mirando lso logs
> de
> la BD??
>

Si quieres ver el problema mira los logs de la postgres, en caso de
que falte información verifica las opciones de logeo en
postgresql.conf, talvez necesites cambiar los niveles de mensajes en
la sección - When to Log -.

Saludos

--
Agustin Casiva
http://www.osis.com.ar
casivaagustin(at)gmail(dot)com
http://www.casivaagustin.com.ar

Para leer adjuntos necesitará Open Office
http://es.openoffice.org/programa/
--
---------------------------(fin del mensaje)---------------------------
TIP 2: puedes desuscribirte de todas las listas simultáneamente
(envíe "unregister TuDirecciónDeCorreo" a majordomo(at)postgresql(dot)org)

--
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.484 / Virus Database: 269.12.0/959 - Release Date: 17/08/2007
17:43

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Arturo Munive [pgsql-es-ayuda] 2007-08-18 16:53:29 Re: Como crear codigos compuestos
Previous Message Agustin Casiva 2007-08-18 14:02:58 Re: Duda conceptual sobre locks en PostgreSQL