Re: row-level deadlock problem

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Kamil Kaczkowski <kamil(at)kamil(dot)eisp(dot)pl>
Cc: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>, Martijn van Oosterhout <kleptog(at)svana(dot)org>, pgsql-general(at)postgresql(dot)org
Subject: Re: row-level deadlock problem
Date: 2004-11-27 21:55:23
Message-ID: 12299.1101592523@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Kamil Kaczkowski <kamil(at)kamil(dot)eisp(dot)pl> writes:
>>> You're mistaken; it takes a row lock on each row it updates. I'm not
>>> sure why the two UPDATEs are visiting the same rows in different orders,
>>> but if they do the failure is certainly possible.
>>
>> One of them could be using an indexscan while the other is not. If the
>> heap is in reverse order compared to the scan, that would explain it.
>>
> In my case deadlock happens between two identical statements executed
> from different transactions and they have the same execution plan(index
> scan on one attribute - 'color' in schema I presented).

That's a bit hard to believe; once the rows are entered in the index
their relative order won't change anymore, so it's real hard to see how
two indexscans could visit them in different orders.

IIRC you said that these commands were being done inside plpgsql
functions, so it's possible that the planner is doing something
different with the parameterized plans than what you see in a simple
EXPLAIN with values already inserted. Still, it's odd that you might
get different plans in different executions of the same function.

I think there is some factor we're not seeing here. Is it possible that
one backend has a cached plan much older than the other one, and that
the planner's plan choice changed over time?

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Kamil Kaczkowski 2004-11-28 03:12:36 Re: row-level deadlock problem
Previous Message Johan Wehtje 2004-11-27 21:17:38 Re: Query on exception handling in PL/pgSQL