2011-06-26 8 views
21

Tengo una aplicación que utiliza la versión 3.6.4 de hibernate y la versión 0.9.1.2 de c3p0 para la agrupación de conexiones. Mi RDBMS subyacente es MySql versión 5.0.67.¿Cuál es el nivel de aislamiento predeterminado que utiliza hibernate si no se establece explícitamente?

Mi instalación de MySQL indica que el nivel de aislamiento por defecto es "REPETIBLE-READ" (4):

mysql> select @@GLOBAL.tx_isolation, @@tx_isolation; 
+-----------------------+-----------------+ 
| @@GLOBAL.tx_isolation | @@tx_isolation | 
+-----------------------+-----------------+ 
| REPEATABLE-READ  | REPEATABLE-READ | 
+-----------------------+-----------------+ 

no he cambiado o configurado el nivel de aislamiento dentro hibernate.cfg.xml o en cualquier parte dentro de mi aplicación. Desde la aplicación, uso el siguiente código de configuración de impresión:

DatabaseMetaData meta = getSession().connection().getMetaData(); 
System.out.println("Default Tx Isolation: " + meta.getDefaultTransactionIsolation()); 
System.out.println("Current Tx Isolation: " + getSession().connection().getTransactionIsolation()); 

Y consigo los siguientes resultados:

Default Tx Isolation: 2 (=READ_COMMITTED) 
Current Tx Isolation: 4 (=REPEATABLE_READ) 

Por lo tanto, mis preguntas son las siguientes:

  1. Donde hizo el valor "2" vino de? Como el valor predeterminado es REPEATABLE_READ, ¿por qué getDefaultTransactionIsolation() devuelve READ_COMMITTED?
  2. ¿Cuál es el nivel de aislamiento que utiliza hibernate después de todo? REPEATABLE_READ o READ_COMMITTED?
  3. Pensé que cuando no se establece un nivel de aislamiento, hibernate debería usar el valor predeterminado de la base de datos subyacente. ¿Es esto cierto? ¿Tal vez la implementación del controlador jbdc establece un valor predeterminado e hibernate usa esto?

Respuesta

13

parece meta.getDefaultTransactionIsolation()); está codificada en la implementación de DatabaseMetaData en el controlador de MySQL

DatabaseMetaData clase pública implementa java.sql.DatabaseMetaData líneas ....

 

1475 public int getDefaultTransactionIsolation() throws java.sql.SQLException JavaDoc { 
1476  if (this.conn.supportsIsolationLevel()) { 
1477   return java.sql.Connection.TRANSACTION_READ_COMMITTED; 
1478  } else { 
1479   return java.sql.Connection.TRANSACTION_NONE; 
1480  } 
1481 } 

así que apuesto y confiar en getSession(). Conexión() .getTransactionIsolation()

+2

¿Cómo lograrías lo mismo con hibernate 4 ya que connection() ha quedado en desuso? – emt14

+0

De esta manera:.... ((((SessionFactoryImplementor) getSession() getSessionFactory()) .getJdbcServices() getConnectionProvider() getConnection() getTransactionIsolation() // también es obsoleto método y causas "agrupación de conexiones exausted" . de error, pero trabajando Creo método actual es: getSession.doWork (nuevo trabajo() {ejecutar @ Override vacío (Connection conn) {/ * trabajar con conn * /}}); pero estoy no verifica si funciona durante la sesión o no. – Lord

Cuestiones relacionadas