Locking a row with KEY SHARE NOWAIT blocks

From: Heikki Linnakangas <hlinnaka(at)iki(dot)fi>
To: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Locking a row with KEY SHARE NOWAIT blocks
Date: 2019-09-03 13:22:30
Message-ID: b75bd501-9690-738e-6393-0bdd1c881ba8@iki.fi
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

When you lock a row with FOR KEY SHARE, and the row's non-key columns
have been updated, heap_lock_tuple() walks the update chain to mark all
the in-progress tuple versions also as locked. But it doesn't pay
attention to the NOWAIT or SKIP LOCKED flags when doing so. The
heap_lock_updated_tuple() function walks the update chain, but the
'wait_policy' argument is not passed to it. As a result, a SELECT in KEY
SHARE NOWAIT query can block waiting for another updating transaction,
despite the NOWAIT modifier.

This can be reproduced with the attached isolation test script.

I'm not sure how to fix this. The logic to walk the update chain and
propagate the tuple lock is already breathtakingly complicated :-(.

- Heikki

Attachment Content-Type Size
nowait-keyshare-bug.spec text/x-rpm-spec 1.1 KB

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message fn ln 2019-09-03 13:27:49 Re: BUG #15977: Inconsistent behavior in chained transactions
Previous Message Robert Haas 2019-09-03 12:59:53 Re: block-level incremental backup