[pgcluster: 510] Update処理について

AOSHIMA Kentaro aoshima.kentaro @ nttcom.co.jp
2004年 8月 19日 (木) 15:05:04 JST


皆様

いつもお世話になっております。
青嶋と申します。

PGCluster1.0.7av14にて検証を行っておりまして、
別クライアントからのUpdate処理を実施したところ、
次のような事象が発生致しました。
対処方法等ご存知の方いらっしゃいましたらお教え頂ければ幸いです。
お忙しいところ恐縮ではありますが、宜しくお願い致します。


==環境==
ロードバランサ  1台
クラスタDB    2台(DB1、DB2)
レプリケーション 1台

PGCluster1.0.7av14
RHEL AS3.0

テーブルおよびデータは
"pgbench"で作成しました。
レプリケーションサーバのResponse_Modeは
"normal"です。

========

==手順・事象==
1 各クラスタDB(DB1、DB2)に、
  下記のpsqlを実行します。(ほぼ同時に実行します)

  端末A:psql -h DB1 -f update.sql (連続繰返 10回)
    端末B:psql -h DB2 -f update2.sql (連続繰返 10回)

  update.sql
  	begin;
	update tellers set tbalance = 3333 where tid=1;
	update tellers set tbalance = 3333 where tid=2;
	 <省略>
	update tellers set tbalance = 3333 where tid=20;
	commit;

  update2.sql
  	begin;
	update tellers set tbalance = 2222 where tid=1;
	update tellers set tbalance = 2222 where tid=2;
	 <省略>
	update tellers set tbalance = 2222 where tid=20;
	commit;

2 端末A、Bのどちらかの処理が停止し、以下のようなエラーが発生します。
  
	<何回か処理した後以下の状態でフリーズ>
	BEGIN
	psql:update.sql:2: ERROR:  deadlock detected
	psql:update.sql:3: ERROR:  current transaction is aborted, queries ignored
until end of transaction block
	

	このとき残り端末では繰返し処理を実行していました。
    また、端末A,Bから同じDBにpsqlを実行した場合も同じエラーとなりました。
    
    通常のPostgreSQLを使用し、各端末から同様のpsqlを繰り返し実行した場合は、
    エラーなく終了しました。


==質問==
 あまり現実的ではない更新処理ですが、
 回避方法等ございましたら教えていただければ幸いです。

 余談ではありますが、LB経由でpsql接続を行い、
 結果待ちの間でC-cを押下すると、
 クラスタDBのステータスが99に変わり、
 C-cを押す度にクラスタDBがLBから次々に切り離されていくのは
 当方の環境だけでしょうか?






pgcluster メーリングリストの案内