[pgsql-jp: 29119] Re: setAutoCommit で Warning
Daichi Ueura
daichi @ lifeflow.jp
2003年 2月 18日 (火) 20:57:14 JST
上浦です。
鈴木さんありがとうございます。
On Tue, 18 Feb 2003 20:05:04 +0900
"T.Suzuki" <t_suzuki @ kenwood-eng.co.jp> wrote:
> 確かに、logにWARNINGが記録されていましたが、
> どうも原因は、conn.commit()を行っている場所でした。
>
> コミットする場合は、例えば次のようにコミットする必要があるかチェックして、
> トランザクションが進行中以外は、コミットを発行しないようにしては
> する必要があると思います。
>
> if ( st.getUpdateCount() > 0 ) {
> conn.commit();
> }
試してもらえればわかると思うのですが(SQLをUPDATE等に書き換える)、
トランザクションが進行中でもWarningが記録されます。
自動コミットモードがtrue・falseに関わらず、
トランザクションが開始されていない状態で"SELECT"などを実行すると、
自動的にトランザクションが開始されます。
違いは、そのSQLの実行が終わった後でコミットが行われるかです。
つまり上記の例では、トランザクションが進行中であり、
----------------------------------------
> if (conn != null) {
> conn.setAutoCommit(true);
> conn.close();
> // 確認の為、ENDを出力
> out.print("END");
> }
----------------------------------------
conn.setAutoCommit()の内部でコミットが行われていると思います。
投稿してからいろいろ調べたのですが、
やはり、
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が出ていると思われます。
この部分を、
--------------------
execSQL("select 1;");
execSQL("commit; set autocommit = on;");
--------------------
と変更したドライバでは問題が発生していません。
トランザクションが自動で開始されるタイミングに問題があるのかな??
┛
┛ Daichi Ueura
┛
┛ Hiroshima City Univ, Department of Intelligent Systems.
┛ e-mail: (Private) daichi @ lifeflow.jp
┛ : (Office) daichi @ neu.co.jp
┛ : (Univ) g23010 @ cr.info.hiroshima-cu.ac.jp
┛
┛
pgsql-jp メーリングリストの案内