Re: DeadLock

From: "Marcelo Retamal" <mretamal(at)cmet(dot)net>
To: "Lista Postgres" <pgsql-es-ayuda(at)postgresql(dot)org>
Cc: "Alvaro Herrera" <alvherre(at)commandprompt(dot)com>, "Luis Rodrigo Gallardo Cruz" <rodrigo(at)nul-unu(dot)com>
Subject: Re: DeadLock
Date: 2006-09-27 13:43:19
Message-ID: 004401c6e23a$e554d380$da018282@mretamalxp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Gracias, las dos explicaciones muy buenas, hemos quedado super conformes,
sobre todo con la explicación de Alvaro. Vale y gracias.

Pdt: haré la actualización de versión y dentro de los próximos días les
cuento como anda la cosa. Grande PG.

Atte., Marcelo Retamal Vallejos.
Ingeniería de Sistemas
CMET
Fono 251 33 33 Anexo 2431
----- Original Message -----
From: "Alvaro Herrera" <alvherre(at)commandprompt(dot)com>
To: "Luis Rodrigo Gallardo Cruz" <rodrigo(at)nul-unu(dot)com>;
<pgsql-es-ayuda(at)postgresql(dot)org>
Sent: Tuesday, September 26, 2006 9:19 PM
Subject: Re: [pgsql-es-ayuda] DeadLock

> Alvaro Herrera escribió:
>
>> Todo esto es bastante cierto en lo general, pero lamentablemente le
>> falta incluir el efecto de un "bug" en Postgres antes de la version 8.1.
>>
>> Resulta que para implementar las llaves foraneas, Postgres toma un lock
>> exclusivo (SELECT FOR UPDATE) en cada tupla de la tabla referenciada, de
>> manera que no vaya a borrarse esa tupla antes de que "esta" transaccion
>> (i.e. la transaccion que está haciendo el chequeo) termine.
>
> BTW es facil demostrar este efecto en servidores 8.0 y anteriores:
>
> CREATE TABLE primaria (a int primary key);
> CREATE TABLE secundaria (a int REFERENCES primaria, b text);
> INSERT INTO primaria VALUES (1);
> INSERT INTO primaria VALUES (2);
>
> en una sesion:
>
> BEGIN;
> INSERT INTO secundaria VALUES (1);
>
> en otra sesion:
> BEGIN;
> INSERT INTO secundaria VALUES (2);
> INSERT INTO secundaria VALUES (1);
> -- observa que aqui, esta sesion se bloquea
>
>
> En la primera sesion:
> INSERT INTO secundaria VALUES (2);
>
> Aca esta sesion se muere con este mensaje:
>
> ERROR: se ha detectado un deadlock
> DETAIL: El proceso 25507 espera ShareLock en la transacción 199896;
> bloqueado por proceso 25520.
> El proceso 25520 espera ShareLock en la transacción 199895; bloqueado por
> proceso 25507.
> CONTEXT: sentencia SQL: «SELECT 1 FROM ONLY "public"."primaria" x WHERE
> "a" = $1 FOR UPDATE OF x»
>
>
> En 8.1 esto no pasa; de hecho la segunda sesion ni siquiera se bloquea.
>
> --
> Alvaro Herrera
> http://www.CommandPrompt.com/
> The PostgreSQL Company - Command Prompt, Inc.
>
> ---------------------------(fin del mensaje)---------------------------
> TIP 10: visita nuestro canal de IRC #postgresql-es en irc.freenode.net

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Omar Zeballos (Kantutani) 2006-09-27 13:55:20 Comparador de Bases de Datos y/o Esquemas
Previous Message Ernesto Quiñones 2006-09-27 11:41:44 Re: Recibieron éste mensaje?