[PHP-users 14881]Re: [PHP-users14665]PEARでクエリが実行されるときとされない時がある
sorako yamamoto
sorako_yamamoto @ hotmail.com
2003年 4月 24日 (木) 09:07:39 JST
ご返信ありがとうございます。
最初まったく意味不明だったこの現象の問題点が、
皆さんにご助言を頂いたおかげで整理することができました。
(1)不正なSQLが実行されている。
(2)その後に、実行するSQLでトランザクションがアボートする現象が起きることがあ
る
(起きたり起きなかったりまちまち)
> PostgreSQL側で
> current transaction is aborted, queries ignored until
> end of transaction block
>
> が、出ると言うことなので、PostgreSQLの起動時にデバッグレベルを上げて
> ログを取れば、上記 NOTICEメッセージの出力される前行に実行された
> SQLが残ります。
(1)の方は、上記の方法で不正なSQLが何なのか調べてみたいと思います。
(2)の方は、
ご助言頂いた通り、$objCon = DB::connect( $DNS, true);
にしていたためだったようです。
> >DB::connect()って、pg_pconnectを内部で読んでるんでしたっけか?
> >だったら、トランザクションの途中で問題があった場合、明示的に
> >ROLLBACKをかけるか、disconnectで、PostgreSQLとのコネクションを
> >切断しないかぎり、以降のSQL全てが
> >current transaction is aborted, queries ignored until
> >end of transaction block
> >と、怒られるように思えます。
>
> sorako yamamotoさんの場合、これをtrueで呼んでいるので、falseに変えるか、
true :
DBに対して持続的接続を行います。
持続的接続が有効であるとスクリプトが終了してもDBとの接続を切断せず、
Apacheの子プロセスは、PostgreSQLとの接続を維持します。
次にクライアントからの接続要求があり、たまたま同じApacheのプロセスが使用され
ると、
そのDBへの接続が再利用されます。
エラーが出る時は、たまたま同じApacheのプロセスが使用されていたため、
BEGIN後、ロールバックされず、次のセッションでCOMMITを行うと、本来取り消した
かった
はずのトランザクションがCOMMITされていたという解釈でよろしいでしょうか。
> つまり、明示的に $autocommit を false にしない限り、
> わざわざ BEGIN/COMMIT を明示しないでも良いということだと思います。
>
>
> そして、無論、ROLLBACK するときも、rollback() を
> 使わないといけないですね。
えっと、DB::connect( $DNS, false);にすると、
トランザクション中に問題があった場合、
PostgreSQLとのコネクションが切断されるわけですよね。
COMMITされていない時は、トランザクションは強制的にロールバックされる
という認識があるのですが、
この場合は、明示的にロールバックする必要性はないですよね?
> どうも、トランザクションが云々以前に、PEAR DB の使い方を
> 調べもせずに適当に使って、うまくいかないだけの気がしないでもないです。
PostgresSQLとPEARについて、両方分かっていなかったです。
PEARの使い方はソースを見るしか方法はないのでしょうか。
詳しい本とかは出ていないですよね…
初心者はPEARを使用せずに、PHP関数で作った方が良かったのかな。
と少し弱気になってきましたが…
ご助言くださった方どうもありがとうございました。
_________________________________________________________________
ハイセンスな商品を気軽に購入 MSN ショッピング http://shopping.msn.co.jp/
PHP-users メーリングリストの案内