こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

開発環境(centOS、apatch、php、postgresql)

postgrsqlで「current transaction is aborted, commands ignored until end of transaction block」
のエラーが出てしまいました。

・複数テーブルに対してinsertを行っています。
・複数tableのinsert中のどこかでエラーになった場合、全tableをrollbackしたいです。
・複数テーブルのうち、ひとつのtableでは5回insertを行っています。
  for文でまわしているのですが、ここで2回目のinsertの時に
  上記のエラーになってしまいます。

で、トランザクション(begin、rollback、commit)を全てはずしたところ、全てのtableで正常にinsertできました。

上記のエラーを調べてみても rollbackしていない・・・みたいなことしか調べられませんでした。
エラーにはなっていないのでrollbackはしないし、ここでcommitしてしまうと、次のinsertなどでエラーになった時、rollbackできなくなってしまうし。。。

上記のエラーをなくすために
どのような対策をすればいいのかアドバイスをお願いいたします!

投稿日時 - 2016-11-30 10:45:22

QNo.9262124

すぐに回答ほしいです

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

実行されたSQLを直接取る方法はなさそうです。

if(!$sth->execute()){
  //PDOステートメントのデバッグを取得する
  ob_start();
  $sth->debugDumpParams();
  $debug = ob_get_clean();
  print $debug
exit;
}

でそれっぽいものはとれますが、postgresのログを見たほうが100倍わかりよいです。

投稿日時 - 2016-11-30 13:04:18

補足

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

投稿日時 - 2016-11-30 14:26:21

お礼

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

投稿日時 - 2016-11-30 14:19:18

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

直接postgresのエラーログを覗けるなら覗いて下さい。

linuxの場合
lv /var/lib/pgsql/data/pg_log/postgresql-Wed.log

数行前にそのトランザクションがabortされた原因のエラーが必ずあります。

PHPから覗く方法は私は今のところ知りません。

投稿日時 - 2016-11-30 12:59:29

ANo.1

current transaction is aborted, commands ignored ・・・

の前の行にエラーが吐かれてると思うけどエラー無し?????

投稿日時 - 2016-11-30 11:11:14

お礼

muuming2001さん、有難うございます。

pg_prepare(・・・・
の戻り値がfalseになっているので、phpで「error表示」しています。
そのとき、 pg_last_error()で取得した内容をログに記録しています。
そのログが、上記のメッセージになっていました。

phpアプリのログで、pg_prepare内に記載する変数の値を直前に記録していますが、特に問題はなさそうです。(怪しいですか?)

1回目が正常で、2回目がNGなので、繰り返すときの値の設定が悪いと思うのですが、、、トランザクションを除くとうまくいくことも理解できません。
今回、セキュリティ対策として pg_prepareを使うように変更したのですが、debugがやりにくくて、原因がわかりません。
このときのsqlを見る方法(pg_prepare+pg_executeの)なんてあるのでしょうか?

引き続きまして、よろしくお願いいたします。

投稿日時 - 2016-11-30 12:42:35

あなたにオススメの質問