Re: select for update - Mailing list pgsql-admin

From Tom Lane
Subject Re: select for update
Date
Msg-id 1161.1303528668@sss.pgh.pa.us
Whole thread Raw
In response to Re: select for update  (Craig James <craig_james@emolecules.com>)
Responses Re: select for update  (Craig James <craig_james@emolecules.com>)
List pgsql-admin
Craig James <craig_james@emolecules.com> writes:
> On 4/22/11 1:58 PM, Tom Lane wrote:
>> Craig James<craig_james@emolecules.com>  writes:
>>> select objectid from archive where db_id is null limit 1 for update

>> The interaction between LIMIT and FOR UPDATE changed in 9.0 ... what
>> PG version are you using?

> 8.4.4

Well, note what it says in the 8.4 SELECT reference page:

                Caution

    It is possible for a SELECT command using both LIMIT and FOR
    UPDATE/SHARE clauses to return fewer rows than specified by
    LIMIT. This is because LIMIT is applied first. The command
    selects the specified number of rows, but might then block
    trying to obtain a lock on one or more of them. Once the SELECT
    unblocks, the row might have been deleted or updated so that it
    does not meet the query WHERE condition anymore, in which case
    it will not be returned.

I think what's probably happening to you is you're getting a NULL not
because there isn't a matching row, but because somebody is updating the
first matching row underneath you and then the LIMIT prevents finding
any other matches.  However, that pseudo-code is too pseudo to tell
whether this theory is correct.

(9.0 handles these situations in a less unintuitive fashion, btw.)

            regards, tom lane

pgsql-admin by date:

Previous
From: Brian Fehrle
Date:
Subject: archive_timeout behavior (8.4.6)
Next
From: Tom Lane
Date:
Subject: Re: DELETE FROM pg_description WHERE ...