Re: deadlock with truncate and foreing keys

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Alexey Nalbat <nalbat(at)price(dot)ru>
Cc: pgsql-general(at)postgresql(dot)org, pgsql-hackers(at)postgresql(dot)org, Stephan Szabo <sszabo(at)megazone(dot)bigpanda(dot)com>
Subject: Re: deadlock with truncate and foreing keys
Date: 2008-02-18 19:56:39
Message-ID: 29603.1203364599@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-hackers

Alexey Nalbat <nalbat(at)price(dot)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

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Gregory Stark 2008-02-18 20:32:25 Re: deadlock with truncate and foreing keys
Previous Message Stefan Niantschur 2008-02-18 19:46:48 Re: How to return a large String with C

Browse pgsql-hackers by date

  From Date Subject
Next Message Peter Eisentraut 2008-02-18 20:09:34 Re: Ad Hoc Indexes
Previous Message Justin 2008-02-18 19:38:35 Ad Hoc Indexes