- ベストアンサー
postgresqlのトランザクションについて
- postgrsqlで「current transaction is aborted, commands ignored until end of transaction block」のエラーが発生しました。エラーを解決するためにはどのような対策が必要でしょうか?
- トランザクションを全てはずすと正常にinsertできるが、エラーが発生した際のrollbackができなくなるため、対策が必要です。
- 複数テーブルに対してinsertを行っている際に、エラーが発生した場合に全てのテーブルをrollbackしたいですが、エラーがないためrollbackが行われていません。対策を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
実行されたSQLを直接取る方法はなさそうです。 if(!$sth->execute()){ //PDOステートメントのデバッグを取得する ob_start(); $sth->debugDumpParams(); $debug = ob_get_clean(); print $debug exit; } でそれっぽいものはとれますが、postgresのログを見たほうが100倍わかりよいです。
その他の回答 (2)
- muuming2001
- ベストアンサー率23% (202/847)
直接postgresのエラーログを覗けるなら覗いて下さい。 linuxの場合 lv /var/lib/pgsql/data/pg_log/postgresql-Wed.log 数行前にそのトランザクションがabortされた原因のエラーが必ずあります。 PHPから覗く方法は私は今のところ知りません。
- muuming2001
- ベストアンサー率23% (202/847)
current transaction is aborted, commands ignored ・・・ の前の行にエラーが吐かれてると思うけどエラー無し?????
お礼
muuming2001さん、有難うございます。 pg_prepare(・・・・ の戻り値がfalseになっているので、phpで「error表示」しています。 そのとき、 pg_last_error()で取得した内容をログに記録しています。 そのログが、上記のメッセージになっていました。 phpアプリのログで、pg_prepare内に記載する変数の値を直前に記録していますが、特に問題はなさそうです。(怪しいですか?) 1回目が正常で、2回目がNGなので、繰り返すときの値の設定が悪いと思うのですが、、、トランザクションを除くとうまくいくことも理解できません。 今回、セキュリティ対策として pg_prepareを使うように変更したのですが、debugがやりにくくて、原因がわかりません。 このときのsqlを見る方法(pg_prepare+pg_executeの)なんてあるのでしょうか? 引き続きまして、よろしくお願いいたします。
お礼
muuming2001さん、ありがとうございます! postgresのログを見ましたところ、原因がわかりました。 ステートメント名が既に存在している、、、でした。 何気なく、他の箇所では全て別名で記述していましたが、それが大事だったんですね。for文だったので添え字をくっつけたステートメント名にして正常に実行することができました。 助かりました!
補足
トランザクションをいれるとエラーになるのは何故なのか?、トランザクション無しだと何故成功するのか? 疑問が残りますが、処理としては解決できたので取り急ぎ「良し!」とします。