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