[pgpool-hackers: 44] Implementing SERIAL rewriting
Tatsuo Ishii
ishii at postgresql.org
Wed Mar 21 17:44:50 JST 2012
Hi,
I have been thinking about implementing SERIAL rewriting in pgpool's
native replication mode. Currently we deal with SERIAL by using
insert_lock. This has some shortcomings however:
1) Using locks degrades performance
2) Once a sequence is not in sync for some reason, there is no way to
force re-sync except using online recovery.
So here is the idea...
Suppose we have a table:
CREATE TABLE t1(i SERIAL, j int);
If an INSERT is issued:
INSERT INTO t1 VALUES(default, 1);
then we rewrite it to following forms:
on the master:
SELECT nextval('t1_i_seq'); -- suppose this returns 100
INSERT INTO t1 VALUES(100, 1);
on the slaves:
SELECT setval(('t1_i_seq', 100);
INSERT INTO t1 VALUES(100, 1);
This way, no table lock is necessary and sequences are forced to sync
among servers.
One problem I could forsee is:
Suppose we have two different session A and B to pgpool. It is
possible that following order of SQL execution could happen:
A: SELECT nextval('t1_i_seq'); -- suppose this returns 100
B: SELECT nextval('t1_i_seq'); -- suppose this returns 101
A: INSERT INTO t1 VALUES(100, 1); -- on the master and slaves
B: INSERT INTO t1 VALUES(101, 1); -- on the master and slaves
B: SELECT setval('t1_i_seq', 101); -- on the slaves
A: SELECT setval('t1_i_seq', 100); -- on the slaves
In this scenario, the sequence' value results in 101 on the master, on
the other hand 100 on the slaves. Any idea how to prevent this?
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp
More information about the pgpool-hackers
mailing list