[Pgcluster-general] technical question

Markus Schiltknecht markus at bluegap.ch
Wed Jan 24 16:29:00 UTC 2007


Hi,

Andreas Kostyrka wrote:
> Well, how does pgcluster serialize statements?

AFAICT, per statement, ordering them by incoming time...

> And does it apply
> statements done on two connections concurrently?

Hm. I'm unclear what exactly you are asking.

I think I can give a better example, without the confusing now() 
function, which is already nondeterministic by itself:

initialize a table with:

CREATE TABLE test (a int NOT NULL);
INSERT INTO test VALUES (1);

then concurrently run this insert on multiple nodes:

UPDATE test SET a = (SELECT max(a) + 1 FROM test);

Normally, in READ COMMITTED mode, the subselect might or might not yet 
see the other's update. There's a race condition, which normally gets 
solved with a FOR UPDATE.

In SERIALIZABLE mode, this gives you a serialization error.

I don't know how exactly PgCluster handles FOR UPDATE, but if you simply 
replicate all statements and wait for every cluster node (as in 
PgCluster's reliable mode, I guess), you will get exactly the same 
behavior regarding this issue.

So, the above transaction should better be something like:

BEGIN;
x = (SELECT max(a) + 1 FROM test FOR UPDATE);
UPDATE test SET a = x;
COMMIT;

This works for both isolation levels and AFAIK with PgCluster as well. 
Mr. Mitani, please correct me if I'm wrong.

Regards

Markus


More information about the Pgcluster-general mailing list