Обсуждение: 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
Вложения
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.