Re: [pgsql-ru-general] [pgsql-ru-general] Дедлоки и FOREIGN (pg9.1.2) - Mailing list pgsql-ru-general

From Alexey Klyukin
Subject Re: [pgsql-ru-general] [pgsql-ru-general] Дедлоки и FOREIGN (pg9.1.2)
Date
Msg-id 43330F42-8BAC-48DB-9E52-C3AC682D7FE0@commandprompt.com
Whole thread Raw
In response to Re: [pgsql-ru-general] Дедлоки и FOREIGN (pg9.1.2)  (Sergey Konoplev <gray.ru@gmail.com>)
List pgsql-ru-general
On Dec 21, 2012, at 12:20 PM, Dmitry E. Oboukhov <unera@debian.org> wrote:

> 
> инсерты идут по одному.
> 
> но вот дедлочится тот (первый) инсерт который идет в одной транзакции
> с вставкой в ордер.
> 
> собственно вставка выглядит так:
> 
> BEGIN TRANSACTION;
> 
> INSERT INTO orders ... RETURNING "id"
> INSERT INTO orders_logs
>    oid = вставленый_выше id,
>    uid = определенный вне транзакции uid,
>    comment = 'Заказ такой-то создан'
> 
> COMMIT
> 
> 
> таблица orders не имеет ссылок ни на какие другие таблицы.
> таблица orders_logs имеет ссылки на users и orders
> 
> дедлочится это с запросом (вне транзакции)
> 
> UPDATE
>    users
> SET
>    status = что-то
> WHERE
>    id = тот же юзер что и выше
> 
> 
> связь я улавливаю, но природу дедлока понять не могу :)

Проблема, похоже, вызвана тем, что при вставке строки в таблицу с внешними ключами соответствующая строка в таблице, на
которуюссылается внешний ключ, блокируется на запись до конца транзакции, поэтому запрос UPDATE может ожидать окончания
транзакциис INSERT . Чего ждет сама эта транзация - не совсем понятно, возможно users имеет внешний ключ на orders, тут
полезнопосмотреть pg_locks вместе с pg_stat_activity.
 

Проблема, если это она, известная, ее решение отложено до выхода 9.3:
https://commitfest.postgresql.org/action/patch_view?id=987

--
Alexey Klyukin        http://www.commandprompt.com
The PostgreSQL Company – Command Prompt, Inc.





pgsql-ru-general by date:

Previous
From: "Dmitry E. Oboukhov"
Date:
Subject: Re: Re: [pgsql-ru-general] Дедлоки и FOREIGN(pg9.1.2)
Next
From: "Dmitry E. Oboukhov"
Date:
Subject: не используется индекс