Re: odd deadlock on CREATE TABLE AS SELECT - Mailing list pgsql-bugs

From Tom Lane
Subject Re: odd deadlock on CREATE TABLE AS SELECT
Date
Msg-id 20805.1257727139@sss.pgh.pa.us
Whole thread Raw
In response to odd deadlock on CREATE TABLE AS SELECT  ("digital.death@gmx.it" <digital.death@gmx.it>)
Responses Re: odd deadlock on CREATE TABLE AS SELECT  (digitaldeath <digital.death@gmx.it>)
List pgsql-bugs
"digital.death@gmx.it" <digital.death@gmx.it> writes:
> I hope it's not a bug, but I get a deadlock error in a
> function/transaction with these statements:

It's not a bug.  The CREATE TABLE AS SELECT is acquiring a read lock on
table "adc", and then the ALTER TABLE RENAME tries to upgrade that lock
to exclusive.  If you've got some other stuff going on with "adc" at
the same time, a deadlock isn't surprising in the least.

You could make the function safe by adding "LOCK TABLE adc" before
the select.  However, if the idea is to not hold a strong lock on adc
while the CREATE is going on, this approach isn't going to work :-(

I kinda think you have more bugs than that, btw.  If a deadlock is
happening it's probably because some other process also had read lock
on "adc" and is trying to upgrade it, which would strongly suggest
that the other process is trying to modify the contents of "adc",
which would be a Real Bad Thing because it implies that you're losing
data with this.  Any changes committed into "adc" after the function
starts are not going to be reflected in the updated version of "adc",
which cannot be what you want.

            regards, tom lane

pgsql-bugs by date:

Previous
From: "Viisard"
Date:
Subject: BUG #5172: ecpg - cursor with regexp containing '.*/' fails to compile with gcc
Next
From: Tom Lane
Date:
Subject: Re: BUG #5174: [minor] directories symlinked into base/ are not recursively removed