Re: [pgsql-ru-general] [pgsql-ru-general] Дедлоки и FOREIGN (pg9.1.2)
От | Alexey Klyukin |
---|---|
Тема | Re: [pgsql-ru-general] [pgsql-ru-general] Дедлоки и FOREIGN (pg9.1.2) |
Дата | |
Msg-id | 43330F42-8BAC-48DB-9E52-C3AC682D7FE0@commandprompt.com обсуждение исходный текст |
Ответ на | Re: [pgsql-ru-general] Дедлоки и FOREIGN (pg9.1.2) (Sergey Konoplev <gray.ru@gmail.com>) |
Список | 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 по дате отправления: