[pgsql-jp: 33187] Re: コネクションクローズ時に WARNING: ROLLBACK: no transaction in progress が出ます

ALIHALA Hiroshi arihara.hiroshi @ jp.fujitsu.com
2004年 6月 10日 (木) 09:37:24 JST


おはようございます。

>>>>> At <Thu, 10 Jun 2004 03:20:32 +0900>
>>>>> In <200406091820.AA00002 @ win2k.desu.ne.jp> 
>>>>> erika g <elica @ desu.ne.jp> wrote:
> ごとう と申します。

> java関連はやったことがないので、見当違いかもしれませんが。

> hanny さんは書きました:
> >
> >java.sql.Connection でコネクションを生成しています。(conn)
> >オートコミットをオフにして、トランザクションを実行しています。
> >
> >conn.setAutoCommit(false);
> >
> >その後、ビジネスロジックを実行し、UPDATE 処理を実行後、
> >
> >conn.commit();
> >
> >として COMMIT した後に、コネクション conn をクローズするタイミ
> >ングで、PostgreSQLが
> >
> >WARNING:  ROLLBACK: no transaction in progress
> >
> >という WARNING を吐いています。
> >特に ROLLBACK 処理を行っているところはないので、何故このような
> >WARNING が出るのか疑問です。
> >

> no transaction
> と言われていますが、トランザクションの開始はしているのでしょうか?
> 今までPHPしかまともに使用したことがないので、よくわからないのですが。

 JDBC の場合、通常 SQL 文を投げるメソッド(executeUpdateなど)一文を
トランザクション単位として扱い、メソッドが完了すると自動 commit する
ようになってます。
 一文の SQL ではトランザクションが終わらない場合、質問元の方のよう
に自動 commit を一時的に停止します(setAutoCommit(false))。


> 普通に、PostgreSQLのコマンドで、beginし忘れてSQLを叩いた後、
> commitすると、似たようなメッセージが出たな〜、と思いまして。

 そうですね。ただ、JDBC の場合は明に begin を送らないでも前述の手続
きを踏めばトランザクションになるので、何か別の原因があるような気がし
ます。

大まかな流れ
Connection conn = 〜;
conn.setAutoCommit(false);
Statement st = conn.createStatement();
try {

//↓ここから
  st.executeUpdate("INSERT INTO 〜");
  st.executeUpdate("UPDATE 〜");
//↑ここまでがトランザクション

  if(正常処理確認) {
    conn.commit();
  } else {
    con.rollback();
  }
} catch(SQLException e) {
  conn.rollback();
}

 書かれた情報内では問題が無いと思うんですが、トランザクション内に書
かれている SQL 文がおかしいとかでも WARNING 出た気がします。

-- 
____________________________________________________________________
 ALIHALA Hiroshi [ arihara.hiroshi @ jp.fujitsu.com ]
  富士通(株) システムサポート事業本部 サポートデスク統括部 OSC運用部
_ Don't quote a signature, when you reply a message. ____________..|



pgsql-jp メーリングリストの案内