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

Yoshiharu Mori y-mori @ sraoss.co.jp
2007年 3月 2日 (金) 16:11:39 JST


盛と申します。

On Fri, 2 Mar 2007 13:57:27 +0900
"asano" <asano @ engm.com> wrote:

> お世話になっております。エニグマ 浅野と申します。
> 
> 
> 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」という単語から察するに、制約違反らしきエラーが出てしまいました。
> 
> これは単純に当方の設定ミスなのでしょうか。

この場合にはトランザクション処理が可能かと思いますが、このエラーはシステムDBにuser_data
テーブルに関する情報が登録されていないということです。

http://pgpool.sraoss.jp/index.php?pgpool-II%2Ftutorial#q2da26d3
の[テーブル dist_def の定義]を参考に、pgpool_catalog.dist_defへテーブル定義を行えば良いと
思います。

差し支え無ければ、port 5432番のDB名pgpoolで定義されているpgpool_catalog.dist_defテーブル
の内容を見せていただけないでしょうか?

> それともやはり、
> 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 mailing list
> pgpool-general-jp @ sraoss.jp
> http://www.sraoss.jp/mailman/listinfo/pgpool-general-jp
> 
> 


-- 
SRA OSS, Inc. Japan
Yoshiharu Mori <y-mori @ sraoss.co.jp>
http://www.sraoss.co.jp/



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