[pgsql-jp: 29124] Re: setAutoCommit で Warning
T.Suzuki
t_suzuki @ kenwood-eng.co.jp
2003年 2月 18日 (火) 22:17:18 JST
鈴木です。
> > if ( st.getUpdateCount() > 0 ) {
> > conn.commit();
> > }
> 試してもらえればわかると思うのですが(SQLをUPDATE等に書き換える)、
> トランザクションが進行中でもWarningが記録されます。
検証不足でした。確かに、Warningが出ます。
#そんな、簡単な問題じゃないですよね。失礼しました。
> 投稿してからいろいろ調べたのですが、
> やはり、
> org.postgresql.jdbc1.AbstractJdbc1Connection#setAutoCommit()
> があやしいかと。。
> --------------------
> if (autoCommit)
> {
> if (haveMinimumServerVersion("7.3"))
> {
> //We do the select to ensure a transaction is in process
> //before we do the commit to avoid warning messages
> //from issuing a commit without a transaction in process
> execSQL("select 1; commit; set autocommit = on;");
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> }
> --------------------
> ここで、トランザクション中・トランザクション終了のどちらの状態においても
> ログにWarningを記録せずにトランザクションを終了させるようになっていると
> 思います。
>
> しかし、実際にはトランザクションが終了している状態でこのステートメントに
> さしかかった場合、"select 1;"が実行されてもトランザクションが開始されて
> いないようで、"commit;"の実行でWarningが出ていると思われます。
この3つのSQLコマンドが正しく実行できる事を確認する為、
psql にて、流れを再現した所…
hoge=# autocommit = off;
hoge=# select 1; commit; set autocommit = on;
Warningのログは出ません。
ならば、psqlで実行した場合と、executeQuery()で実行した場合に
問題があるのかと思い、次の処理をサンプルソース中で実行しました。
rs = st.executeQuery("select 1; commit; set autocommit = on;");
すると、Warningのログが出ました。
executeQueryや、execSQLを介するとWarningが出る事から、
org.postgresql.core.QueryExecutor.java で、SQLをバックエンドになげる
処理があやしい気がしたのですが…、バックエンドについて理解不足で
これ以上の解析は断念しました。
> この部分を、
> --------------------
> execSQL("select 1;");
> execSQL("commit; set autocommit = on;");
> --------------------
> と変更したドライバでは問題が発生していません。
>
> トランザクションが自動で開始されるタイミングに問題があるのかな??
一回のexecute()で、問い合わせとコミットを発行しても、
トランザクションが開始された事にならないのでしょうか…?
だとしたら、2回に分けて実行する事で解決できたのには納得がいきます。
詳細は、JDBCからバックエンドに渡されたSQLが、どういった手順で実行
されるかについて理解しないと分かりませんね…。
#力不足でお答えになりませんでした。申し訳ないです。
-----------------------------------------
鈴木 徹 (SUZUKI Toru)
KENWOOD ENGINEERING CORPORATION
E-mail:t_suzuki @ kenwood-eng.co.jp
-----------------------------------------
pgsql-jp メーリングリストの案内