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