Re: Consulta sobre deadlock

From: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>
To: "Viveros A(dot), Guillermo M(dot)" <gviveros(at)safp(dot)cl>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta sobre deadlock
Date: 2005-01-13 22:56:02
Message-ID: 20050113225602.GE11197@dcc.uchile.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Thu, Jan 13, 2005 at 05:47:59PM -0300, Viveros A., Guillermo M. wrote:

Hola Guillermo, que tal,

> Durante los procesos que se dejan corriendo en la noche, existe un error
> en la base de datos que simplemente dice:
>
> ERROR: deadlock detected
>
> Quisiera saber como puedo obtener mas información de dicho error, como
> por ejemplo, que transacciones fueron las que causaron el problema, que
> programas estaban trabajando en ese momento con la Base de datos, etc.

Las otras lineas que acompañan el mensaje de error (CONTEXT, DETAIL,
etc) deben contener la informacion detallada del deadlock que se ha
detectado. En particular deberia indicar que transacciones estan
involucradas, y cuales son las caracteristicas de los locks que cada una
tiene que causan el deadlock.

> Se han realizado varias pruebas, pero cuando ejecutamos lo mismo que se
> realizó en la noche, el proceso termina satisfactoriamente.

El truco es hacerlo con la concurrencia adecuada.

Esto no es mas que una mera adivinanza, pero lo mas probable es que se
trate de las llaves foraneas. Esto es un bug en Postgres, que ha
costado mucho tiempo corregir porque en realidad no se ha tenido una
propuesta para hacerlo. Casualmente mi proximo proyecto de desarrollo
es de esta linea, de manera que con un poco de suerte estara corregido
en 8.1.

Un ejemplo trivial que lo demuestra:

create table a (a serial primary key);
create table b (b serial primary key);

create table c (a int references a);
create table d (b int references b);

insert into a default values;
insert into b default values;

begin;
insert into c values (1);
-- otra sesion
begin;
insert into d values (1);
insert into c values (1);
-- se congela: esta esperando un lock
-- de la otra transaccion
insert into d values (1);
-- deadlock.

El problema puntual es que se utiliza SELECT FOR UPDATE para bloquear
los registros involucrados en llaves foraneas, a falta de un mecanismo
que permita bloquear registros con candados compartidos (problema que es
precisamente el que no ha sido resuelto).

--
Alvaro Herrera (<alvherre[(at)]dcc(dot)uchile(dot)cl>)
Jason Tesser: You might not have understood me or I am not understanding you.
Paul Thomas: It feels like we're 2 people divided by a common language...

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2005-01-13 23:04:11 Re: lock timeout
Previous Message Alvaro Herrera 2005-01-13 22:47:21 Re: Para quien me pueda ayudar...