• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:postgresqlのトランザクションについて)

postgresqlのトランザクションについて

このQ&Aのポイント
  • postgrsqlで「current transaction is aborted, commands ignored until end of transaction block」のエラーが発生しました。エラーを解決するためにはどのような対策が必要でしょうか?
  • トランザクションを全てはずすと正常にinsertできるが、エラーが発生した際のrollbackができなくなるため、対策が必要です。
  • 複数テーブルに対してinsertを行っている際に、エラーが発生した場合に全てのテーブルをrollbackしたいですが、エラーがないためrollbackが行われていません。対策を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

実行されたSQLを直接取る方法はなさそうです。 if(!$sth->execute()){   //PDOステートメントのデバッグを取得する   ob_start();   $sth->debugDumpParams();   $debug = ob_get_clean();   print $debug exit; } でそれっぽいものはとれますが、postgresのログを見たほうが100倍わかりよいです。

jg1wjz
質問者

お礼

muuming2001さん、ありがとうございます! postgresのログを見ましたところ、原因がわかりました。 ステートメント名が既に存在している、、、でした。 何気なく、他の箇所では全て別名で記述していましたが、それが大事だったんですね。for文だったので添え字をくっつけたステートメント名にして正常に実行することができました。 助かりました!

jg1wjz
質問者

補足

トランザクションをいれるとエラーになるのは何故なのか?、トランザクション無しだと何故成功するのか? 疑問が残りますが、処理としては解決できたので取り急ぎ「良し!」とします。

その他の回答 (2)

回答No.2

直接postgresのエラーログを覗けるなら覗いて下さい。 linuxの場合 lv /var/lib/pgsql/data/pg_log/postgresql-Wed.log 数行前にそのトランザクションがabortされた原因のエラーが必ずあります。 PHPから覗く方法は私は今のところ知りません。

回答No.1

current transaction is aborted, commands ignored ・・・ の前の行にエラーが吐かれてると思うけどエラー無し?????

jg1wjz
質問者

お礼

muuming2001さん、有難うございます。 pg_prepare(・・・・ の戻り値がfalseになっているので、phpで「error表示」しています。 そのとき、 pg_last_error()で取得した内容をログに記録しています。 そのログが、上記のメッセージになっていました。 phpアプリのログで、pg_prepare内に記載する変数の値を直前に記録していますが、特に問題はなさそうです。(怪しいですか?) 1回目が正常で、2回目がNGなので、繰り返すときの値の設定が悪いと思うのですが、、、トランザクションを除くとうまくいくことも理解できません。 今回、セキュリティ対策として pg_prepareを使うように変更したのですが、debugがやりにくくて、原因がわかりません。 このときのsqlを見る方法(pg_prepare+pg_executeの)なんてあるのでしょうか? 引き続きまして、よろしくお願いいたします。

関連するQ&A