Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search archives
  Advanced Search

Weird behavior with "sensitive" cursors.



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


Home | Main Index | Thread Index

Privacy Policy | About PostgreSQL
Copyright © 1996 – 2012 PostgreSQL Global Development Group