Обсуждение: Re: [pgsql-ru-general] Дедлоки и FOREIGN (pg9.1.2)

Поиск
Список
Период
Сортировка

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

От
Sergey Konoplev
Дата:
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

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

От
"Dmitry E. Oboukhov"
Дата:
>> 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

Вложения

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

От
Alexey Klyukin
Дата:
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.