[pgsql-jp: 26805] Re: ERROR: SET TRANSACTION ISOLATION LEVEL must be called before any queryについて

Ryouichi Matsuda r-matuda @ sra.co.jp
2002年 7月 24日 (水) 10:49:28 JST


松田亮一です。

On Mon, 22 Jul 2002 12:50:21 +0900, iwacchi wrote:
> ConnectionPoolを使って、Connectionを使いまわしているのですが、commitに関する
> 命令(setautocommit,commit,rollback)をコールする箇所で
> > java.sql.SQLException: ERROR:  SET TRANSACTION ISOLATION LEVEL must be
> called before any query

このエラーは、psqlで次のように実行すると発生します。

psql=> begin; -- (1)
psql=> select * from pg_user; -- (2)
psql=> set transaction isolation level read committed; -- (3)

トランザクション隔離レベルの設定は、トランザクション開始直後に行う必要
があります。つまり、(1)→(3)→(2)という順番なら大丈夫です。

PostgreSQL7.1.3のJDBCのソースを見ると、"set transaction isolation
level ..."を実行するメソッドは、

  (a) commit(), rollback(), setAutoCommit()
  (b) setTransactionIsolationLevel()

(a)は、"begin"してから"set transaction isolation level ..."を実行する
ので、(1)→(3)という順番だから大丈夫。

(b)は、"begin"しないで"set transaction isolation level ..."を実行する
ので、その前までに実行したSQLによっては(1)→(2)という順番になるために、
エラーが発生する可能性があります。


> 当MLには事例がないようですが、米国のサイトにはConnectionPoolのクラスに問題が
> あったという人が1人いただけでした。

ConnectionPoolは、何を使っていますか?

そのコネクションプールの実装、または使い方によっては、(1)→(2)→(3)と
いう順番でエラーになっているのかもしれません。

___________________________________________________________
 Ryouichi Matsuda  (http://www.sra.co.jp/people/r-matuda/)




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