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

Yutaka tanida yutaka @ hi-net.zaq.ne.jp
2002年 8月 29日 (木) 15:59:44 JST


谷田です。

#締め切り(何の?)は明日だ・・・ということで現実逃避

On Thu, 29 Aug 2002 15:47:36 +0900
"chico" <chico @ dreamkit.com> wrote:

> [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を共に新しいバージョン
> にしてから経験しました。
> 
> どなたかお知恵をお貸しくださいませ。
> よろしくおねがいします。

単に(1)で登録されたidの値と(2)で取得した値とが異なる(後の方が+1)というこ
とではないのですか?確実に(1)が2回発生しているのでしょうか?

実は前者だとすれば、(1)と(2)全体をbegin-ccommitでくくれば解決だと思いま
す。


-- 
Yutaka tanida <yutaka @ nonsensecorner.com>
http://www.nonsensecorner.com/




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