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
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? |