[pgsql-jp: 27191] pg_execが2度実行されてしまう現象

chico chico @ dreamkit.com
2002年 8月 29日 (木) 15:47:36 JST


チコと申します。
どなたかご相談にのってくださいませ。(PostgreSQL+PHP)

[環境]
 TurboLinux 6.1
 PostgreSQL 7.2.1
 PHP 4.2.2

[Q] pg_exec()でinsertを1度しか実行していないのに2度実行されることがある。
    この現象は必ず発生するのではなく不定期に起こります。

試したことは、まず以下のように簡単なテーブルを作成しておいて、
drop table foo;
drop   sequence foo_id_seq;
create table foo (
  id       serial,
  name     text not null,
  primary key(id)
);
grant all on foo to nobody;
grant all on foo_id_seq to nobody;

PHPスクリプトでは、以下のような処理の流れです。
(呼出し側のFORMからnameはPOSTされるという設定です)
(エラー処理は省いて書きました)

  $name = $_POST['name'];
  $con = pg_connect("host=xxx port=5432 dbname=xxx user=xxx password=xxx");
  $sql = "insert into foo(name) values('$name')"
  $rtn = pg_exec($con, $sql); --------------------- (1)
  $sql = "select currval('foo_id_seq')";
  $rtn = pg_exec($con, $sql); --------------------- (2)
  $new_id = pg_result($rtn, 0, 0);

この(1)の処理が稀に2度実行されてしまう個所です。
(1)と(2)の間で、pg_cmdtuples()を使い影響のあったタプル数を
表示してみましたが、2度実行された場合でも1行しか影響が
ないという結果となりました。

単に、登録後に次のシークエンス値を得たいだけなのですが、
発生する条件をつきとめられませんでした。
今までも似たようなことをやってきて問題となったことは
なかったのですが、PostgreSQLとPHPを共に新しいバージョン
にしてから経験しました。

どなたかお知恵をお貸しくださいませ。
よろしくおねがいします。




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