BUG #6608: SELECT FOR UPDATE not obtaining row exclusive locks in CTEs

From: duncan(dot)burke(at)orionvm(dot)com(dot)au
To: pgsql-bugs(at)postgresql(dot)org
Subject: BUG #6608: SELECT FOR UPDATE not obtaining row exclusive locks in CTEs
Date: 2012-04-23 05:32:43
Message-ID: E1SMBtD-0006lv-FG@wrigleys.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 6608
Logged by: Duncan Burke
Email address: duncan(dot)burke(at)orionvm(dot)com(dot)au
PostgreSQL version: 9.1.3
Operating system: gentoo
Description:

I found that running a SELECT FOR UPDATE query in a CTE does not block
simultaneous transactions from running the same query. i.e it appears to not
be obtaining an exclusive row lock as expected.

CREATE TABLE foo (
x int PRIMARY KEY,
y int
);

INSERT INTO foo VALUES (0,0);

CREATE FUNCTION lock_0(int) returns int as $$
WITH locked as (
SELECT 1 FROM foo
WHERE x = $1
FOR UPDATE)
SELECT 1
$$ LANGUAGE SQL;

CREATE FUNCTION lock_1(int) returns int as $$
WITH locked as (
UPDATE FOO
SET y = y
WHERE x = $1)
SELECT 1
$$ LANGUAGE SQL;

--run in two simultaneous transactions, lock_0 does not block
BEGIN;
SELECT lock_0(0);
COMMIT;

--run in two simultaneous transactions, lock_1 blocks
BEGIN;
SELECT lock_1(0);
COMMIT;

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Matteo Beccati 2012-04-23 11:49:39 Errors on CREATE TABLE IF NOT EXISTS
Previous Message Jochen Erwied 2012-04-23 05:20:26 Re: BUG #6605: wrong type cast from timestamp to timestamptz