Re: How to use read uncommitted transaction level and set update order - Mailing list pgsql-general

From Christophe Pettus
Subject Re: How to use read uncommitted transaction level and set update order
Date
Msg-id 2B183AB3-E09B-4BD9-AF49-9FDD796EECE7@thebuild.com
Whole thread Raw
In response to Re: How to use read uncommitted transaction level and set update order  ("Andrus" <kobruleht2@hot.ee>)
Responses Re: How to use read uncommitted transaction level and set update order
Re: How to use read uncommitted transaction level and set update order
List pgsql-general
On Dec 19, 2009, at 4:06 PM, Andrus wrote:
> 1. In my case b expression needs values from previous rows updated
> in this same command before:
>
> b= (select sum(a) from test1 where
> <select_test1_previously_updated_rows_condition> )
>

I believe there is a misunderstanding as to what "read committed"
isolation level means.  Read committed means that a particular
transaction will not see uncommitted work in a *different
transaction*.  It *does* see uncommitted work done previously in the
same transaction.  So, if you do:

BEGIN;

UPDATE table1 SET a=1 WHERE b=2;
SELECT a FROM table1 WHERE b=2;

You will get back 1, even before a COMMIT.

> I understand that it is not possible to read previous rows without
> creating hack using triggers.

As noted above, that's not correct.  You cannot access new values of a
particular row within a single UPDATE statement, but you do see new
values done in the same transaction.

This is explain in some detail in the documentation:

    http://www.postgresql.org/docs/8.4/interactive/transaction-iso.html#XACT-READ-COMMITTED

> 2. In my planned UPDATE statement instead of 4 there is an
> expression containing one big CASE WHEN expression with many WHEN ..
> THEN  clauses.
> This command  takes several hundreds of lines.
> Your solution requires repeating this expression two times and thus
> makes sql difficult to read.

If it is an invariant condition of your database schema that two
particular columns must always have the same value, a trigger is an
appropriate way of enforcing that.

> It seems that splitting update statement into separate UPDATE
> commands in proper order, one for every  column and commiting
> transaction after every update is the only solution.

Again, it does seem you are not quite understanding what read
committed isolation mode actually means; I'd encourage you to read the
documentation.

--
-- Christophe Pettus
    xof@thebuild.com


pgsql-general by date:

Previous
From: Christophe Pettus
Date:
Subject: Re: How to use read uncommitted transaction level and set update order
Next
From: Jeff Davis
Date:
Subject: Re: modelling question