[pgcluster: 416] 主キー違反時の挙動について

Wataru Oguro oguro @ zenrin-datacom.net
2004年 7月 15日 (木) 12:40:10 JST


oguroです。

・RedHatLinux7.3(クラスタサーバ2台、レプリケーションサーバ1台)
・PGCluster1.0.7rc6

主キーの設定してあるテーブルに対してinsert文を発行すると、クラスタサーバ
のクエリーがフリーズしてしまいます。
既存のレコードに対する主キー制約違反は即座にエラーが帰ってくるようです
が、クラスタサーバ1,2からレコードを追加する場合に主キー違反となるよう
なケースだと、この現象が起こるようです。

具体的な手順は以下の通りです。

 1.DBへ接続(クラスタサーバ1、2両方)
  psql test

 2.トランザクションを開始(クラスタサーバ1)
  #begin;
  BEGIN

 3.クエリー発行(クラスタサーバ1)
  #insert into test values('105');
  INSERT 131430 1

 4.トランザクションを開始(クラスタサーバ2)
  #begin;
  BEGIN

 5.クエリーを発行(クラスタサーバ2)
  #insert into test values('105');
  *クラスタサーバ1のトランザクション終了待ちと思われる待機状態になる

 6.トランザクションを終了(クラスタサーバ1)
  #commit;
  *フリーズ(クエリーのキャンセルも不可)

5.の時点で、主キー制約チェックのためにクラスタサーバ1のトランザクショ
ン終了待ちを行っているように見えたのですが、6.でクラスタサーバ1のトラ
ンザクションをcommitすることができないため、クラスタサーバ2も待機したま
まになります。
6.の後、レプリケーションサーバを終了させると、クラスタサーバ1,2の両
機で待機していたクエリーが実行され(エラーは出ません)、クラスタサーバ
1,2のそれぞれのテーブルにレコードがinsertされます。





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