[pgcluster: 428] Re: 107av9をリリースしました

Wataru Oguro oguro @ zenrin-datacom.net
2004年 7月 23日 (金) 19:50:34 JST


oguroです。

>トランザクション内で主キーが重複するINSERT文でロック回避が出来ずに固まっ
>てしまう現象について,対応しました.
>
フリーズする症状は改善されているのを確認いたしました。
ただ、この修正で新しい現象が発現いたしました。

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

上記環境でトランザクション内で主キーが重複するinsertを発行した場合に、マスタクラスタDBで2重にデータが登録されてしまいます。

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

*クラスタサーバ1がマスタです。

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

 2.テーブルを作成(クラスタサーバ1 or 2)
  create table test (a varchar(10), constraint pk_test primary key(a));

 3.insert文を発行(クラスタサーバ1)
  begin;
  insert into test values('105');

 4.データを確認(クラスタサーバ1)
  select * from test;

    a
  -----
   105
  (1 row)

 5.insert文を発行(クラスタサーバ2)
  begin;
  insert into test values('105');

  *クラスタサーバ1のトランザクションの終了待ち

 6.データを確認(クラスタサーバ1)
  select * from test;

    a
  -----
   105
  (1 row)

 7.トランザクションをロールバック(クラスタサーバ1)
  rollback;

  *クラスタサーバ2のinsert文が流れる

 8.データを確認(クラスタサーバ1、2)
  select * from test;

  /* クラスタサーバ1の結果 */ -->意図したとおりの結果です。
   a
  ---
  (0 rows)

  /* クラスタサーバ2の結果 */ -->これも意図したとおりですね。
    a
  -----
   105
  (1 row)

 9.トランザクションをコミット(クラスタサーバ2)
  commit;

 10.データを確認(クラスタサーバ1、2)
  select * from test;

  /* クラスタサーバ1の結果 */ -->戻るのは1行のはず・・・
    a
  -----
   105
   105
  (2 rows)

  /* クラスタサーバ2の結果 */ -->意図したとおりの結果です。
    a
  -----
   105
  (1 row)

主キー制約を無視して重複してデータが入ってしまうのはマスタクラスタDBだけのようです。
また、5.の部分で明示的にトランザクションを指定しない場合、クラスタサーバ2のクエリーは一見トランザクション終了待ちを行っているように見えるのですが、クラスタサーバ1でデータを検索するとすでにデータが登録されており、同値の行が2行検索されます。
こちらのケースは、7.でcommitを行った場合でも重複登録されるようです。

クラスタサーバ1、2とも明示的にトランザクションを指定している場合は、7.でcommitを行うとクラスタサーバ2に主キー制約違反のエラーが返ってきます。

#DBは再構築しているので、デマではないはずです。。。





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