2011-09-14 6 views
6

私たちは、Hibernate 3.2.5とともにPostgreSQL 9.1.0を使用しています。Postgres 9.0での休止分離レベル

最新のJDBCドライバJDBC4 Postgresql Driver, Version 9.1-901をダウンロードしました。

私は休止状態の分離プロパティを設定しました。

2=READ_COMMITTED 

を意味しますが、データベースにアクセスしようとすると、それは私にエラーを与える

<property name="connection.isolation">2</property> 

Caused by: org.postgresql.util.PSQLException: Cannot change transaction isolation level in the middle of a transaction. 
at org.postgresql.jdbc2.AbstractJdbc2Connection.setTransactionIsolation(AbstractJdbc2Connection.java:821) 
at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:103) 
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:423) 

隔離レベルのプロパティを削除するとそれはうまく動作します。 すべてのヘルプは、エラーメッセージを見ると

答えて

5

をいただければ幸いです:「トランザクションの途中でトランザクション分離レベルを変更できない」、Hibernateは(SELECTを実行することによって)トランザクションを開始してからしようとしているようです分離レベルを変更してください。

これは、接続を開いた後に最初にアイソレーションレベルを変更するか、アイソレーションレベルを変更する前にコミットまたはロールバックを発行して開始したものを終了する必要があるため、HibernateのPostgreSQLとの統合のバグです。 。

あなたの唯一の選択肢(バグレポートを開く以外)は分離設定を除外することです。とにかくREAD_COMMITTEDはPostgresのデフォルトの分離レベルなので、違いはありません。

+0

私は「分離設定」をスキップしました。そしてその作業 –

+0

私はHibernate 3からHibernate 4へのアプリケーションのアップグレードの一環として、この同じ問題を追いかけています.Hibernateを初期化し、ユーザー定義型を収集するためにPostgresに対してクエリを実行することと関係しているようです。 –

+0

接続プールが設定されていれば、問題は見えません。私の状況では、テストにのみ影響し、トランザクションの分離を指定しないようにテスト構成を変更することができました。 –

1

私はHibernateの専門家だ、とあなたは分離レベルを変更したり、1つのレベルですべてをやってする必要がある場合、私は知りませんが、あなたのようなものを使用して、データベースのデフォルトの分離レベルを設定できます。

ALTER DATABASE mydatabase SET default_transaction_isolation = 'serializable' 
\g 

あなたはまた、ユーザーごとにdefault_transaction_isolationを設定、またはすべてのデータベースとユーザーのためのあなたのpostgresql.confファイルで設定するALTER USERを使用することができますhttp://www.postgresql.org/docs/9.1/interactive/sql-alterdatabase.html

を参照してください。

+0

これは私の問題を解決しました、ありがとう! –

関連する問題