RE: [HACKERS] READ COMMITTED isolevel is implemented ... - Mailing list pgsql-hackers

From Hiroshi Inoue
Subject RE: [HACKERS] READ COMMITTED isolevel is implemented ...
Date
Msg-id 001501be4dc3$be698360$2801007e@cadzone.tpf.co.jp
Whole thread Raw
In response to Re: [HACKERS] READ COMMITTED isolevel is implemented ...  (Vadim Mikheev <vadim@krs.ru>)
List pgsql-hackers
Hello all,

> -----Original Message-----
> From: root@sunpine.krs.ru [mailto:root@sunpine.krs.ru]On Behalf Of Vadim
> Mikheev
> Sent: Monday, February 01, 1999 1:54 PM
> To: Hiroshi Inoue
> Cc: hackers@postgreSQL.org
> Subject: Re: [HACKERS] READ COMMITTED isolevel is implemented ...
> 
> 
> Hiroshi Inoue wrote:
> > 
[snip]

> > 
> > create table t (id int4,dt int4,name text);
> > insert into t values (10,5,'a0');
> > insert into t values (20,10,'b0');
> > insert into t values (30,15,'c0');
> > 
> > id      |dt     |name
> > ----------------------------
> > 10      |5      |a0
> > 20      |10     |b0
> > 30      |15     |c0
> > 
> > 
> > session-1               session-2               session-3
> > 
> > [Case-1]
> > update t set dt=dt+1,
> >                   ^^^^^^^^
> >         name='c1'
> >     where id=30;
> > UPDATE 1
> >                         update t set dt=dt+2
> >                         where dt >7;
> >                         ^^^^^^^^^^^^^
> >                         (blocked)
> >                                                 update t set dt=dt+3,
> >                                                              ^^^^^^^^^
> >                                                         id=id+1
> >                                                     where id=10;
> >                                                 UPDATE 1
> >                                                 commit;
> >                                                 COMMIT
> > commit;
> > COMMIT
> >                         UPDATE 3
> >                         ^^^^^^^^^^^^
> 
> Ops. I'm quite suprized that T2 sees changes made by T3 after
> T2' statement started! What would be results if T3 wouldn't
> make UPDATE but made INSERT INTO t VALUES (11, 8, 'a1') ?
>
The result was
UPDATE 3
id    |dt    |name----------------------------10    |5    |a020    |12    |b030    |18    |c111    |10    |a1 
> > [result]        id      |dt     |name
> >         ---------------------------
> >         11      |10     |a0
> >         20      |12     |b0
> >         30      |18     |c1
> > 
> > If      dt=dt+1      ==>  dt=dt
> >             ^^^^^^^^
> > then            UPDATE 3  ==> UPDATE 2
> >         ^^^^^^^^^^^^
> > 
> > [result]        id      |dt     |name
> >         ---------------------------
> >         11      |8      |a0
> >         20      |12     |b0
> >         30      |17     |c1
> > 
> 
> Why T2 doesn't change id=11 row now???
> Does Oracle re-execute _entire_ query after being blocked
> by concurrent transaction T only if T made changes in columns
> used in QUAL?!
> 
> Yes! Case-2 confirmes this!
> 
> > [Case-2]
> > 
> > update t set dt=dt+1,
> >               ^^^^^^^^
> >         name='c1'
> >     where id=30;
> > UPDATE 1
> >                         update t set dt=dt+2
> >                         where id > 10;
> >                                  ^^^^^^^^^
> >                         (blocked)
> >                                                 update t set dt=dt+3,
> >                                                         id=id+1
> >                                                         ^^^^^^^^
> >                                                     where id=10;
> >                                                 UPDATE 1
> >                                                 commit;
> >                                                 COMMIT
> > commit;
> > COMMIT
> >                        UPDATE 2
> >                       ^^^^^^^^^^^^
> > 
> > [result]        id      |dt     |name
> >         ---------------------------
> >         11      |8      |a0
> >         20      |12     |b0
> >         30      |18     |c1
> 
> id is not changed by T1 and so T2 doesn't re-execute query
> after T1 committed and doesn't see changes made by T3!
> T2 just re-evaluates target list.
> 
> Ok. Postgres always re-executes query after being blocked,
> but makes this for single row only and so all other changes
> made after query started are not visible. I would say that
> we are more consistent than Oracle -:))
> 
> Oracle says:
> ---
> Oracle always enforces statement-level read consistency. 
> This guarantees that the data returned by a single query 
> is consistent with respect to the time that the query began.
> Therefore, a query never sees dirty data nor any of the changes 
> made by transactions that commit during query execution. As query 
> execution proceeds, only data committed before the query began is 
> visible to the query. The query does not see changes committed after
> statement execution begins. 
> ---
> 
> Your tests show that Oracle breaks this statement if re-evaluation
> of query' qual is required!
> 

I don't think so.
It seems that Oracle changes the time that the query began and 
re-executes the query (or processes something like re-execution 
more effective than re-execution).

So [ Case-1 ] is reasonable for me.

In case of dt=dt+1,the time that the query of T2 began was changed  
to the time when T1 was committed and in case of dt=dt,it was not 
changed from the time when the query command was issued.
I think that both cases hold column-level read consistency.

But [ Case-2 ] is a question for me.

When did the query of T2 begin ? 
It seems that only the values of old target dt ( ... set dt=dt+2 ...) are 
at the time when T1 was committed.                ^^^ 

> Just wondering what would be the results of these test in
> Informix or Sybase?
> Could someone run them?

Anyway the version of Oracle used for my test is very old.
The result may be different in newer version.
Cound someone run them in Oracle8 ?

Thanks.

Hiroshi Inoue
Inoue@tpf.co.jp


pgsql-hackers by date:

Previous
From: Ian Grant
Date:
Subject: Is libpq re-entrant?
Next
From: "Thomas G. Lockhart"
Date:
Subject: Re: [HACKERS] Re: Reducing sema usage (was Postmaster dies with many child processes)