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 по дате отправления: