【问题标题】:Hibernate Isolation Level With Postgres 9.0Postgres 9.0 的休眠隔离级别
【发布时间】:2011-11-17 00:55:27
【问题描述】:

我们使用 Postgres 9.1.0 和 Hibernate 3.2.5。

我已经下载了最新的JDBC驱动@​​987654321@。

我已经设置了休眠隔离属性。

<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)

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

【问题讨论】:

    标签: hibernate postgresql jdbc


    【解决方案1】:

    查看错误消息:“Cannot change transaction isolation level in the middle of a transaction”,Hibernate 似乎启动了一个事务(例如通过运行 SELECT),然后尝试更改隔离级别。

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

    您唯一的选择(除了打开错误报告)是忽略隔离设置。因为 READ_COMMITTED 是 Postgres 的默认隔离级别,无论如何这不会有什么不同。

    【讨论】:

    • 在将应用程序从 Hibernate 3 升级到 Hibernate 4 的过程中,我正在追查同样的问题。它似乎与 Hibernate 初始化和对 Postgres 执行查询以收集用户定义的类型有关.
    • 我相信如果您配置了连接池,您将不会看到问题。在我的情况下,它只影响测试,我可以将测试配置更改为不指定事务隔离。
    【解决方案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 文件中为所有数据库和用户设置它。

    【讨论】:

      猜你喜欢
      • 2019-12-13
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多