Thread: SELECT FOR UPDATE....LIMIT ...broken

SELECT FOR UPDATE....LIMIT ...broken

From
Darren Govoni
Date:
Hi,
 I have a simple scenario that is producing incorrect results with
8.3,ubuntu.

I have queries attempting the same "select-for update limit 1". at the
same time. There are 2 rows in my test database.

The first will enter the transaction and only update ONE of the rows it
selected, because it uses "LIMIT 1" in the select for update.only 1 row
is returned.

The second naturally will block when entering the query until the first
commits its update. But when the second unblocks, it sees 0 rows, even
though there is 1 row left that satisfies its query.

If I re-run the second query, it finds the 1 row left. But not when
released from the UPDATE block.

This seems like a bug to me. Is it fixed in the current dev build? Or is
there something else I'm missing?

Darren


Re: SELECT FOR UPDATE....LIMIT ...broken

From
Tom Lane
Date:
Darren Govoni <darren@ontrenet.com> writes:
> This seems like a bug to me. Is it fixed in the current dev build? Or is
> there something else I'm missing?

I think you have not read the documentation about FOR UPDATE and LIMIT
on the SELECT reference page:
http://www.postgresql.org/docs/8.3/static/sql-select.html#SQL-FOR-UPDATE-SHARE
Note the second CAUTION block in particular.

            regards, tom lane

Re: SELECT FOR UPDATE....LIMIT ...broken

From
Darren Govoni
Date:
Well, I did, but I clicked the link to Chapter 13 before scrolling down
further to see the Caution section. Heheh.

Thanks for the heads up.

On Sun, 2009-01-11 at 12:12 -0500, Tom Lane wrote:
> Darren Govoni <darren@ontrenet.com> writes:
> > This seems like a bug to me. Is it fixed in the current dev build? Or is
> > there something else I'm missing?
>
> I think you have not read the documentation about FOR UPDATE and LIMIT
> on the SELECT reference page:
> http://www.postgresql.org/docs/8.3/static/sql-select.html#SQL-FOR-UPDATE-SHARE
> Note the second CAUTION block in particular.
>
>             regards, tom lane
>