deadlock problems with foreign keys - Mailing list pgsql-hackers

From Mario Weilguni
Subject deadlock problems with foreign keys
Date
Msg-id D143FBF049570C4BB99D962DC25FC2D201EB4D@freedom.icomedias.com
Whole thread Raw
Responses Re: deadlock problems with foreign keys
Re: deadlock problems with foreign keys
List pgsql-hackers
I've a severe problem with deadlocks in postgres, when using referential integrity it's quite easy to trigger
deadlocks.I think the may be a bug in ri_trigger.c (discussed later). Here's some short example: 

create table languages ( id        integer not null, name      text    not null, primary key(id)
);

create table entry ( id        integer not null, lang_id   integer, sometext  text, primary key (id), foreign key (
lang_id) references languages (id) 
);

insert into languages values (1, 'english');
insert into languages values (2, 'german');

insert into entry values (1, 1, 'text 1');
insert into entry values (2, 1, 'text 2');


transaction A: begin;
transaction A: update entry set sometext='text 1.1' where id=1;
transaction A: .... do more time-consuming processing here...
meanwhile, B: begin;           B: update entry set sometext='text 2.1' where id=2;

-- both processes hang now

I think this is too much locking here, because the logfile show's something like this:
'select 1 from "languages" where id=$1 for update' (2 times).

Now I've a lot of tables (around 30) and use referential integrity a lot on ~10 columns (language, country....) , and
withmore fields it's very easy to deadlock the whole system (it happens a lot in my web applicaiton with ~20 concorrent
users).

IMHO the "select ... for update" on languages is not necessary, since I do not want to update "lang_id", but I might be
wrong.The other problem is, that this will make postgres in benchmarks very slow (with many concurrent connections), at
leastif the application is not trivial. 

IMO the problem is in ri_trigger.c around line 390:    /* ----------     * The query string built is     *    SELECT 1
FROMONLY <pktable> WHERE pkatt1 = $1 [AND ...]     * The type id's for the $ parameters are those of the     *
correspondingFK attributes. Thus, SPI_prepare could     * eventually fail if the parser cannot identify some way     *
howto compare these two types by '='.     * ----------     */ 

Any ideas if this is a bug or simply strict SQL standard?

Best regards,Mario Weilguni



pgsql-hackers by date:

Previous
From: Jessica Perry Hekman
Date:
Subject: Re: Mailing List Question
Next
From: "Rod Taylor"
Date:
Subject: Re: deadlock problems with foreign keys