[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 メーリングリストの案内