[pgsql-jp: 31791] Re: PGCluster-1.0.6リリースしました

mitani mitani @ sraw.co.jp
2003年 12月 15日 (月) 14:07:05 JST


いつもレポートありがとうございます.
三谷@広島です.
> -------
> begin;
> lock table
> update test set a = 'test2' where a = 'test2';
> commit;
> -------
上記のトランザクションを2台のクラスタサーバ,1台のレプリケーションサーバ
で試してみました.
手順は以下の通りです.
まず,端末A,B,C,Dを用意し,AとBはクラスタ(1)に,CとDはクラスタ(2)
にpsqlコマンドで接続しました.
次にそれぞれの端末から順次コマンドを実行しました.
1回目-----------------------
A:begin;
B:begin;
C:begin;
D:begin;
2回目-----------------------
A:lock table;
B:lock table;
C:lock table;
D:lock table;
Aのみ"LOCK TABLE"が返ってきてそれ以外の端末はロックされています.
3回目-----------------------
A:update test set a = 'test2' where a = 'test2';
B:update test set a = 'test2' where a = 'test2';
C:update test set a = 'test2' where a = 'test2';
D:update test set a = 'test2' where a = 'test2';
Aのみ"UPDATE 1"が返ってきてそれ以外の端末はロックされたままです.
4回目-----------------------
A:commit;
B:commit;
C:commit;
D:commit;
Aは"COMMIT"が返ってきました.
他の端末もそれぞれ処理され,"LOCK TABLE","UPDATE 1", "COMMIT"が返ってき
ました.

私はabコマンドの中身や,作られたcgiの中身が分からないので何とも言えない
のですが,クラスタサーバにクエリーを投げるプロセスはそれぞれ独立していま
すでしょうか.

例えば,

同時接続数分セッション作成
同時接続数分ループ
{
	セッションに対してクエリー実行;
}

という感じでシングルタスクで回している場合,1つのクエリーがロックされて
返ってこないと,次のクエリーを投げることが出来ず,ツールの側で固まってし
まいます.

以下のような感じで行ってみてください.
同時接続数分ループ
{
	プロセス作成
	IF(子プロセス)
	{
		セッション作成
		クエリー実行
		終了処理
	}
}

ちなみに,レプリケーションサーバからクエリーサーバへの更新要求は,オリジ
ナルのlibpqライブラリをそのまま使っていますので,バックエンドから見ると,
フロントエンドからの更新要求か,レプリケーションサーバからの更新要求か区
別はつきません(良くも悪くもありますが).

=============================
三谷 篤<mitani @ sraw.co.jp>
=============================






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