Weird behavior with "sensitive" cursors.

From: Daniel F <dbf13db(at)gmail(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: Weird behavior with "sensitive" cursors.
Date: 2009-09-30 17:35:51
Message-ID: 235395b90909301035v7228ce63q392931f15aa74b31@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Hi -

I'm seeing a behavior with updatable cursors that matches neither the
behavior
of a sensitive cursor nor an insensitive one. In summary, I'm running with
serializable as the isolation level and rows updated within the same
transaction seem to disappear under the cursor.

From the postgres documentation (I'm using 8.3.0), specifying FOR UPDATE
should
provide the client with a sensitive cursor: "If the cursor's query includes
FOR UPDATE or FOR SHARE, then returned rows are locked at the time they are
first fetched, in the same way as for a regular SELECT command with these
options. In addition, the returned rows will be the most up-to-date
versions;
therefore these options provide the equivalent of what the SQL standard
calls a
sensitive cursor."

But then I get this behavior:
{{{
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET
begin;
BEGIN
show transaction isolation level;
transaction_isolation
-----------------------
serializable
(1 row)

create table foo (a bigint);
CREATE TABLE
insert into foo select generate_series(0, 9);
INSERT 0 10
select * from foo;
a
---
0
1
2
3
4
5
6
7
8
9
(10 rows)

declare c1 no scroll cursor for select * from foo for update;
DECLARE CURSOR
update foo set a=1000 where a>5;
UPDATE 4
fetch all from c1;
a
---
0
1
2
3
4
5
(6 rows)

select * from foo;
a
------
0
1
2
3
4
5
1000
1000
1000
1000
(10 rows)

abort;
ROLLBACK
}}}

Based on my interpretation of cursor sensitivity, I should:

* See rows 0 through 9 if the cursor is insensitive. In fact, this is what
I
get if I remove the FOR UPDATE option.
* See the same as a SELECT command executed within the same transaction if
the
cursor is sensitive.

This seems like a bug to me, and it prevents one from getting sensitive
cursors
with postgres. Can anybody explain the behavior above?

thanks a lot,

-daniel

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Ricky Tompu Breaky 2009-09-30 17:43:35 I can not drop a user/role because an object depent on it.
Previous Message Ivano Luberti 2009-09-30 16:30:46 Re: error message and documentation