- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:postgresqlでのトランザクションについて)
PostgreSQLでのトランザクションについて
このQ&Aのポイント
- PostgreSQLでのトランザクションについてエラーが発生しました
- トランザクションの処理でWARNING "進行中のトランザクションがありません"のエラーが発生
- drop文の実行時に明示的なトランザクションの処理が必要かどうかについて質問
- みんなの回答 (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/tutorial-transactions.html
お礼
mino-motsuさん、ありがとうございます! もう一度、1:1対応になっているか確認してみます。 また、 DROP TABLE IF EXISTS <table name>; というSQLも教えていただき、大変助かりました。 過去に、sqlで存在確認をしようといろいろ試したのですが、できなかった履歴がありました。(当然、上記とは違ったsqlがコメントになっていました) 早速組み入れてみます。 ありがとうございました。