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.