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 |
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 |