アプリ版:「スタンプのみでお礼する」機能のリリースについて

postgresqlで、「WARNING  進行中のトランザクションがありません」のエラーが出てしまいました。

これはそのままの意味だと思うのですが
直す方法がわかりません。
ワーニングなので、、、といいたいところですが、そうもいかず。

apのログで、トランザクション関係の辺りを見ましたところ、
トランザクションを開始し、
TABLEをDROPしようとしましたが、存在しなかった(ようだ)。
(PQexecがエラーでリターン)
存在しないけれど、commit してトランザクションを終わらせている。

のが原因かなと思いました。

なので、PQexec()がエラーの場合はcommitしなければいいのかと
はずしましたが結果は同じでした。

トランザクションが無いのだからrollbackもいらないですよね。


そこで質問ですが
drop文、1ステップのSQL実行も明示的にトランザクションの処理をしたほうがいいのでしょうか?

このワーニングは通常のトランザクションの処理の中で、どういう時にでるのでしょうか?


oracleとpostgresqlの明示的・暗黙的な制御に戸惑っています。
(oracleからpostgresqlに移行することになりました)


叱咤でも何でもかまいませんので、アドバイスよろしくお願いいたします。

A 回答 (1件)

PostgreSQLではOracleと異なりDDLで自動コミットされないので、基本的にはBEGINとCOMMIT(またはROLLBACK)で囲むのが基本です。



今回のWARNINGは、すでにトランザクションが終了しているのにCOMMIT/ROLLBACKを発行したために発生しています。アプリケーションのコードパスでBEGINとCOMMIT/ROLLBACKが1:1対応になっていない箇所(ROLLBACKしているのにCOMMITもしている、など)があるのではないでしょうか?

また、今回のケースではテーブルが存在しないことが通常ケースとしてあり得るということのようなので、DROP TABLE IF EXISTS <table name>;というDDLを使うのが良いと思います。

ちなみに、PostgreSQLではトランザクション開始後にエラーが発生してもトランザクションは終了せずabort状態に遷移します。この状態では、COMMIT/ROLLBACK以外の全てのSQLがエラーになります。COMMIT/ROLLBACKを実行すると、どちらでもトランザクションはROLLBACKされて終了します。
https://www.postgresql.jp/document/9.3/html/tuto …

参考URL:https://www.postgresql.jp/document/9.3/html/sql- …
    • good
    • 0
この回答へのお礼

mino-motsuさん、ありがとうございます!

もう一度、1:1対応になっているか確認してみます。

また、
DROP TABLE IF EXISTS <table name>;
というSQLも教えていただき、大変助かりました。
過去に、sqlで存在確認をしようといろいろ試したのですが、できなかった履歴がありました。(当然、上記とは違ったsqlがコメントになっていました)

早速組み入れてみます。
ありがとうございました。

お礼日時:2014/11/07 10:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A