Postgres 9.0的Hibernate隔离级别

时间:2011-09-14 13:24:57

标签: hibernate postgresql jdbc

我们正在使用Postgres 9.1.0和Hibernate 3.2.5。

我已下载最新的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)

如果我删除隔离级别属性。它工作正常。 任何帮助将不胜感激

2 个答案:

答案 0 :(得分:5)

查看错误消息:“无法在事务中间更改事务隔离级别”,似乎Hibernate启动事务(例如通过运行SELECT)然后尝试更改隔离级别。

这似乎是Hibernate的PostgreSQL集成中的一个错误,因为它应该在打开连接后更改隔离级别,或者在更改隔离级别之前通过发出提交或回滚来结束任何已启动的内容。

您唯一的选择(除了打开错误报告)是省略隔离设置。因为READ_COMMITTED是Postgres的默认隔离级别,无论如何都不应该有所作为。

答案 1 :(得分:1)

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