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
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 |
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 |