Thread: Re: [pgsql-ru-general] Дедлоки и FOREIGN (pg9.1.2)
2012/12/20 Dmitry E. Oboukhov <unera@debian.org>: > orders_logs - имеет FOREIGN на users и orders соответственно (uid, > oid) > > Кронскрипт иногда юзерам обновляет статусы > > UPDATE > users > SET > status = что-то там, > time = NOW() > WHERE > id = что-то там > > а в orders_logs иногда пишутся события: > > INSERT INTO > "orders_logs" > > ("uid", "oid", "time", "event") > VALUES > (123, 2345, NOW(), что-то там) > > и вот обновление статуса у юзера изредка встает в дедлок с инсертом в > orders_logs. > > как такой дедлок можно вылечить? Судя по всему инсерты идут пачками в транзакции, так? Можно ли отказаться от транзакции, делая отдельные инсерты? > > -- > > . ''`. Dmitry E. Oboukhov > : :' : email: unera@debian.org jabber://UNera@uvw.ru > `. `~' GPGKey: 1024D / F8E26537 2006-11-21 > `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537 > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.10 (GNU/Linux) > > iEYEAREDAAYFAlDTkMoACgkQq4wAz/jiZTfTlACglZM7Kz5NeLjQzkC4EKMEW2By > FPcAn3Iarn5vMK17ev2s9uCMvTSMSlVZ > =YWp9 > -----END PGP SIGNATURE----- > -- Sergey Konoplev Database and Software Architect http://www.linkedin.com/in/grayhemp Phones: USA +1 415 867 9984 Russia, Moscow +7 901 903 0499 Russia, Krasnodar +7 988 888 1979 Skype: gray-hemp Jabber: gray.ru@gmail.com
>> orders_logs - имеет FOREIGN на users и orders соответственно (uid, >> oid) >> >> Кронскрипт иногда юзерам обновляет статусы >> >> UPDATE >> users >> SET >> status = что-то там, >> time = NOW() >> WHERE >> id = что-то там >> >> а в orders_logs иногда пишутся события: >> >> INSERT INTO >> "orders_logs" >> >> ("uid", "oid", "time", "event") >> VALUES >> (123, 2345, NOW(), что-то там) >> >> и вот обновление статуса у юзера изредка встает в дедлок с инсертом в >> orders_logs. >> >> как такой дедлок можно вылечить? > Судя по всему инсерты идут пачками в транзакции, так? > Можно ли отказаться от транзакции, делая отдельные инсерты? инсерты идут по одному. но вот дедлочится тот (первый) инсерт который идет в одной транзакции с вставкой в ордер. собственно вставка выглядит так: 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 = тот же юзер что и выше связь я улавливаю, но природу дедлока понять не могу :) -- . ''`. Dmitry E. Oboukhov : :’ : email: unera@debian.org jabber://UNera@uvw.ru `. `~’ GPGKey: 1024D / F8E26537 2006-11-21 `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
Attachment
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.