Re: deadlock with truncate and foreing keys

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: deadlock with truncate and foreing keys
Дата
Msg-id 29603.1203364599@sss.pgh.pa.us
обсуждение исходный текст
Ответ на deadlock with truncate and foreing keys  (Alexey Nalbat <nalbat@price.ru>)
Ответы Re: [HACKERS] deadlock with truncate and foreing keys
Список pgsql-general
Alexey Nalbat <nalbat@price.ru> writes:
> create table t1 ( id integer primary key, name text );
> create table t2 ( id integer references t1 );
> insert into t1 values ( 1 );
> insert into t2 values ( 1 );

> Then two concurrent transactions start.

> /* 1 */ begin;
> /* 1 */ truncate t2;
>         /* 2 */ begin;
>         /* 2 */ update t1 set name='foo' where id=1;
> /* 1 */ insert into t2 values ( 1 );

> Here we have deadlock.

Hmm, this happens because RI_FKey_keyequal_upd_pk does

    fk_rel = heap_open(riinfo.fk_relid, AccessShareLock);

but right offhand I see no reason for it to do so --- it doesn't
*do* anything with fk_rel except close it again.  Likewise
RI_FKey_keyequal_upd_fk doesn't seem to really need to touch the
pk_rel.  Is there something I'm missing in that?  Maybe this is
a vestige of earlier coding that did need to touch both rels
to perform the keysequal check?

            regards, tom lane

В списке pgsql-general по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: Initdb failed in PostgreSQL 7.3.21
Следующее
От: Gregory Stark
Дата:
Сообщение: Re: deadlock with truncate and foreing keys