From: | "Hiroshi Inoue" <Inoue(at)tpf(dot)co(dot)jp> |
---|---|
To: | "Vadim Mikheev" <vadim(at)krs(dot)ru> |
Cc: | <hackers(at)postgreSQL(dot)org> |
Subject: | RE: [HACKERS] READ COMMITTED isolevel is implemented ... |
Date: | 1999-02-01 09:17:52 |
Message-ID: | 001501be4dc3$be698360$2801007e@cadzone.tpf.co.jp |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hello all,
> -----Original Message-----
> From: root(at)sunpine(dot)krs(dot)ru [mailto:root(at)sunpine(dot)krs(dot)ru]On Behalf Of Vadim
> Mikheev
> Sent: Monday, February 01, 1999 1:54 PM
> To: Hiroshi Inoue
> Cc: hackers(at)postgreSQL(dot)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 |a0
20 |12 |b0
30 |18 |c1
11 |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(at)tpf(dot)co(dot)jp
From | Date | Subject | |
---|---|---|---|
Next Message | Thomas G. Lockhart | 1999-02-01 12:46:21 | Re: [HACKERS] Re: Reducing sema usage (was Postmaster dies with many child processes) |
Previous Message | Ian Grant | 1999-02-01 08:38:53 | Is libpq re-entrant? |