[pgpool-general-jp: 98] pgpool-II パラレルクエリモードでのトランザクション

asano asano @ engm.com
2007年 3月 2日 (金) 13:57:27 JST


お世話になっております。エニグマ 浅野と申します。


pgpool-II のパラレルクエリモードでは、
いかなる場合においてもトランザクション処理は使用できないのでしょうか。

と言いますのは、
pgpool-IIのwikiを読みますと、
(http://pgpool.sraoss.jp/index.php?pgpool-II%2Frestriction#e6f3775c)

 >BEGIN;
 >INSERT INTO t(a) VALUES (1);
 >SELECT * FROM t ORDER BY a; <-- 上の INSERT した値は見えない
 >END;

という制限項目がありますが、今当方にて制作中のPHPアプリケーションでは、
wikiにて記してある制限と手順が異なり、

pg_query($Resource_ID,"begin;");
pg_query($Resource_ID,"lock table user_data in share row exclusive mode");
$sql = "select max(user_data_id) from user_data";
$res_sql = pg_query($Resource_ID,"$sql");

$result_array = pg_fetch_array($res_sql);
$max = $result_array['max'];
$max += 1;

$sql = "insert into user_data(user_data_id,user_name) values
('$max','$user_name')";
$res_sql = pg_query($Resource_ID,"$sql");

if(!$res_sql || pg_affected_rows($res_sql) !=1){
 exit;
}
pg_query($Resource_ID,"commit;");


と、「SELECT した後に INSERTする」という流れなので、
使用できるかと思っていたのですが、結果は

Warning: pg_query() [function.pg-query]: Query failed: ERROR: pgpool2 sql
restriction DETAIL: cannot find dist_def table info in
/usr/local/apache2/htdocs/user_data_regist.php on line 24


と、「restriction」という単語から察するに、制約違反らしきエラーが出てしまいました。

これは単純に当方の設定ミスなのでしょうか。
それともやはり、
pgpool-II のパラレルクエリモードではトランザクション処理は不可能なのでしょうか。 


他の箇所でもトランザクションを利用したい処理がありまして、
なんとかトランザクション処理が利用できないものかと思っております・・・。

回避策をご存知の方が見えましたら、ご教示いただければ幸いです。
どうかよろしくお願いいたします。


データベースは実機一台にポートで分けて三つを起動させている状態です。
[PostgreSQL起動時コマンド]
PGPORT=5432 pg_ctl -D /usr/local/pgsql/data start
PGPORT=5433 pg_ctl -D /usr/local/pgsql/data.1 start
PGPORT=5434 pg_ctl -D /usr/local/pgsql/data.2 start

[pgpool起動時コマンド]
/usr/local/pgpool/bin/pgpool -d -n &

-------------------------------------------------
[環境]
OS:      Cent OS 4.4
Apache:    httpd-2.0.52
PHP:       4.4.5
PostgreSQL  8.1.4

[PHPインストール時オプション]
'./configure' \
'--with-apxs2=/usr/local/apache2/bin/apxs' \
'--with-gd' \
'--with-jpeg-dir=/usr' \
'--with-zlib-dir=/usr' \
'--with-png-dir=/usr' \
'--with-openssl' \
'--enable-calendar' \
'--enable-mbstring' \
'--enable-mbregex' \
'--enable-zend-multibyte' \
'--enable-ftp' \
'--with-mcrypt' \

[pgpool-II pgpool.conf]

listen_addresses = 'localhost'
port = 9999
pcp_port = 9898
socket_dir = '/tmp'
pcp_socket_dir = '/tmp'
backend_socket_dir = '/tmp'
pcp_timeout = 10
num_init_children = 32
max_pool = 4
child_life_time = 300
connection_life_time = 0
child_max_connections = 0
logdir = '/tmp'

replication_mode = false
replication_strict = true
replication_timeout = 5000
load_balance_mode = false
replication_stop_on_mismatch = false
reset_query_list = 'ABORT; RESET ALL; SET SESSION AUTHORIZATION DEFAULT'
print_timestamp = true
master_slave_mode = false
connection_cache = true
health_check_timeout = 20
health_check_period = 0
health_check_user = 'nobody'
insert_lock = false
ignore_leading_white_space = false
log_statement = false

parallel_mode = true
enable_query_cache = false

pgpool2_hostname = 'localhost'
system_db_hostname = 'localhost'
system_db_port = 5432
system_db_dbname = 'pgpool'
system_db_schema = 'pgpool_catalog'
system_db_user = 'postgres'
system_db_password = ''

backend_hostname0 = ''
backend_port0 = 5432
backend_weight0 = 1
backend_hostname1 = ''
backend_port1 = 5433
backend_weight1 = 1
backend_hostname2 = ''
backend_port2 = 5434
backend_weight2 = 1

------------------
エニグマ   浅野

http://www.engm.com
asano @ engm.com




pgpool-general-jp メーリングリストの案内