2011-09-14 6 views
6

Estamos utilizando Postgres 9.1.0 con Hibernate 3.2.5.Nivel de aislamiento de hibernación con Postgres 9.0

He descargado el último controlador JDBC JDBC4 Postgresql Driver, Version 9.1-901.

Había establecido la propiedad de aislamiento de hibernación.

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

que significa

2=READ_COMMITTED 

pero me da error al intentar acceder a la base de datos.

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) 

Si elimino la propiedad de nivel de aislamiento. Funciona bien. Cualquier ayuda se agradece

Respuesta

5

Mirando el mensaje de error: "No se puede cambiar el nivel de aislamiento de transacción en medio de una transacción", parece que Hibernate inicia una transacción (por ejemplo, mediante la ejecución de un SELECT) y luego trata de cambiar el nivel de aislamiento

Parece ser un error en la integración PostgreSQL de Hibernate, ya que debe cambiar el nivel de aislamiento como lo primero después de abrir la conexión o finalizar lo que se haya iniciado emitiendo una confirmación o reversión antes de cambiar el nivel de aislamiento .

Su única opción (aparte de abrir un informe de error) es dejar fuera la configuración de aislamiento. Como READ_COMMITTED es el nivel de aislamiento predeterminado para Postgres de todos modos, no debería marcar la diferencia.

+0

He saltado 'configuración de aislamiento'. Y su funcionamiento –

+0

Estoy persiguiendo este mismo problema como parte de la actualización de una aplicación de Hibernate 3 a Hibernate 4. Parece tener algo que ver con la inicialización de Hibernate y la realización de una consulta en contra de Postgres para reunir los tipos definidos por el usuario. –

+0

Creo que si tuviera un grupo de conexión configurado, no vería el problema. En mi situación, solo afectó las pruebas, y pude cambiar la configuración de la prueba para no especificar el aislamiento de la transacción. –

1

No soy experto en Hibernate, y no sé si necesita cambiar el nivel de aislamiento o hacer todo en un nivel, pero puede establecer el nivel de aislamiento predeterminado para su base de datos con algo como:

ALTER DATABASE mydatabase SET default_transaction_isolation = 'serializable' 
\g 

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

también se puede utilizar para establecer ALTER USER default_transaction_isolation sobre una base por usuario, o ponerlo en su archivo postgresql.conf para todas las bases de datos y usuarios.

+0

Esto resolvió mi problema, ¡gracias! –

Cuestiones relacionadas