2011-09-14 122 views
6

我們在Hibernate 3.2.5中使用Postgres 9.1.0。休眠與Postgres 9.0的隔離級別

我已經下載了最新的JDBC驅動程序JDBC4 Postgresql Driver, Version 9.1-901

我設置了hibernate隔離屬性。

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

這意味着

2=READ_COMMITTED 

但在嘗試訪問數據庫時,它給我的錯誤。

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

望着錯誤消息:「不能在交易過程中更改事務隔離級別」,似乎休眠啓動事務(例如,通過運行一個SELECT),然後嘗試改變隔離級別。

這似乎是Hibernate PostgreSQL集成中的一個錯誤,因爲它應該在打開連接之後將隔離級別更改爲第一件事,或者在更改隔離級別之前通過發出提交或回滾來結束已啓動的任何事件。

您唯一的選擇(除了打開錯誤報告)是省略隔離設置。由於READ_COMMITTED是Postgres的默認隔離級別,所以不應有所作爲。

+0

我跳過了「隔離設置」。和它的工作 –

+0

我正在追逐這個同樣的問題,作爲從Hibernate 3升級到Hibernate 4的應用程序的一部分。它似乎與Hibernate初始化和對Postgres執行查詢以收集用戶定義類型有關。 –

+0

我相信如果你有一個連接池配置,你不會看到問題。在我的情況下,它隻影響測試,並且我能夠更改我的測試配置以不指定事務隔離。 –

1

我不是休眠專家,我不知道你是否需要進行更改隔離級別或在一個級別上做的一切,但你可以像設置你的數據庫的默認隔離級別:

ALTER DATABASE mydatabase SET default_transaction_isolation = 'serializable' 
\g 

http://www.postgresql.org/docs/9.1/interactive/sql-alterdatabase.html

您還可以使用ALTER USER設置在每個用戶的基礎上default_transaction_isolation,或將其設置爲所有的數據庫和用戶的postgresql.conf文件。

+0

這解決了我的問題,謝謝! –