Hibernate与Postgres 9.0的隔离级别

6
我们正在使用带有Hibernate 3.2.5的Postgres 9.1.0。
我已经下载了最新的JDBC驱动程序。
我已经设置了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)

如果我移除隔离级别属性,它可以正常工作。任何帮助将不胜感激。
2个回答

5
看一下错误信息:“无法在事务中更改事务隔离级别”,似乎Hibernate启动了一个事务(例如运行SELECT),然后尝试更改隔离级别。
这似乎是Hibernate与PostgreSQL集成的一个bug,因为它应该在打开连接后立即更改隔离级别,或通过提交或回滚结束已经开始的内容,然后再更改隔离级别。
你唯一的选择(除了提交故障报告)是省略隔离设置。由于READ_COMMITTED是Postgres的默认隔离级别,因此不应有任何影响。

我正在追踪这个问题,作为将应用程序从Hibernate 3升级到Hibernate 4的一部分。它似乎与Hibernate初始化并执行针对Postgres的查询以收集用户定义类型有关。 - Howard M. Lewis Ship
我相信如果你配置了连接池,就不会出现这个问题。在我的情况下,它只影响了测试,并且我能够更改我的测试配置以不指定事务隔离。 - Howard M. Lewis Ship

2

我不是Hibernate专家,也不知道是否需要更改隔离级别或在一个级别上完成所有操作,但你可以使用类似以下语句来设置数据库的默认隔离级别:

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文件中为所有数据库和用户设置它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接