Re: Documenting serializable vs snapshot isolation levels

From: "Kevin Grittner" <Kevin(dot)Grittner(at)wicourts(dot)gov>
To: "Robert Haas" <robertmhaas(at)gmail(dot)com>
Cc: "Simon Riggs" <simon(at)2ndquadrant(dot)com>, <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Documenting serializable vs snapshot isolation levels
Date: 2009-01-02 18:01:55
Message-ID: 495E0233.EE98.0025.0@wicourts.gov
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

>>> "Robert Haas" <robertmhaas(at)gmail(dot)com> wrote:
>> Not sure about "most". Referential integrity is a pretty common
use
>> case, and it is not covered without explicit locking. Many other
>> common use cases are not, either. I agree many are, and that the
rest
>> can be worked around easily enough that I wouldn't want to see
>> blocking introduced to the degree that non-MVCC databases use for
>> serializable access.
>
> What do you mean by referential integrity? I don't believe you can
> construct a foreign key problem at any transaction isolation level.

I mean that if someone attempts to maintain referential integrity with
SQL code, without using explicit locks, it is not reliable.
Presumably the implementation of foreign keys in PostgreSQL takes this
into account and blocks the kind of behavior shown below. This
behavior would not occur with true serializable transactions.

-- setup
create table parent (parid int not null primary key);
create table child (chiid int not null primary key, parid int);
insert into parent values (1);

-- connection 1 (start of T0)
start transaction isolation level serializable;
select * from parent where parid = 1;
-- parent row exists; OK to insert child.
insert into child values (100, 1);

-- connection 2 (T1)
start transaction isolation level serializable;
select * from child where parid = 1;
-- child row doesn't exist; OK to delete parent
delete from parent where parid = 1;
commit;

-- connection 1 (end of T0)
commit transaction;

-- database now lacks referential integrity
select * from parent;
parid
-------
(0 rows)

select * from child;
chiid | parid
-------+-------
100 | 1
(1 row)

-Kevin

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2009-01-02 18:44:48 Re: Significantly larger toast tables on 8.4?
Previous Message Robert Haas 2009-01-02 17:44:38 Re: Significantly larger toast tables on 8.4?