2011-09-14 77 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

这解决了我的问题,谢谢! –