[pgcluster: 154] ユーザ関数のレプリケート
Masanari Ishida
ishida @ credist.co.jp
2004年 2月 24日 (火) 16:45:57 JST
お世話になります。石田と申します。
PL/pgSQLで更新系の処理が入っている関数を2箇所から実行すると
フリーズ(?デッドロック(?))したような状態になります。
PGClusterではまだ考慮されていないのでしょうか?
構成とテストした内容は以下のとおりです。
PGCluster1.0.6bを使用し、以下のように構築しました。
RP1−−−レプリケーションサーバ/デバッグモードで起動
CL1-5432−−−クラスタサーバ1/port5432で起動
CL1-5434−−−クラスタサーバ1/port5434で起動
CL1-5436−−−クラスタサーバ1/port5436で起動
この構成で以下のようなSELECTとINSERTのあるテスト用のPL/pgSQL
の関数を作成しました。
create function test_func(integer,integer) returns boolean as '
DECLARE
i_fld1 integer;
BEGIN
select fld1 into i_fld1 from tbl1 where fld1=$1;
IF i_fld1 is not null THEN
RETURN false;
END IF;
insert into tbl1 (fld1) values ($2);
RETURN true;
END;
' language 'plpgsql';
2箇所から
select test_func(<適当な数値>,<適当な数値>)
を1000回繰り返すように実行しました。
(2箇所といってもマシンがないので2つターミナルを開いて
クラスタサーバ1から実行しましたが・・・)
例:
test_funcを1000回繰り返す--test_1000_5432.sql/test_100_5434.sql
$ psql -p 5432 -h CL1-5432 -c ./test_1000_5432.sql test_db
$ psql -p 5434 -h CL1-5434 -c ./test_1000_5434.sql test_db
そうするとフリーズ(?デッドロック(?))したような状態になりました。
また、INSERTのみの関数の場合も同様です。SELECTのみの場合は問題
ありませんでした。
ちなみにPGClusterを使用しないpostgreSQL7.3.4では上記のように2箇所
から実行しても問題なく処理できました。
回避できない場合は、PL/pgSQLでの関数の作成をやめることを検討しなけ
ればいけないので宜しくお願いします。
----------------------------------------
Masanari Ishida < ishida @ credist.co.jp >
----------------------------------------
pgcluster メーリングリストの案内