2010-08-17 48 views

Respuesta

8

Si realmente necesita esto, entonces usted quiere hacer algo como:

session.connection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); 

que es idéntica a una nolock.

Antes de hacer eso, realmente piense detenidamente si quiere hacer una lectura sucia. La mayoría de las veces las personas hacen esto porque es lo que siempre han hecho, en lugar de hacerlo porque es lo correcto. En particular, esto no funciona bien con el almacenamiento en caché.

En realidad, this thread aborda un poco las cuestiones. Lea cuidadosamente antes de decidir.

+0

Gracias, Gary. Sí, estaba buscando lecturas sucias. Nuestros DBA recomiendan NOLOCK para todas las "selecciones" en esta área de proyecto. Los problemas fueron, parte de los SQL estaban hibernando. – Sarit

+2

En las últimas versiones de Hibernate, connection() parece eliminarse de la API. ¿Alguna idea sobre cómo se puede lograr un efecto similar sin un objeto de conexión? –

+1

Si usa la anotación '@ Transactional', se puede especificar como la propiedad' isolation'. – Tobb

5

En última versión de Hibernate tiene que hacerlo de esta manera:

Session session = (Session) em.getDelegate(); 
     session.doWork(new Work() { 
      @Override 
      public void execute(Connection connection) throws SQLException { 
       connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); 
      } 
     }); 
+0

He usado este método para establecer niveles de aislamiento de transacciones read_uncommitted en ciertas consultas, pero me di cuenta de que el monto de la conexión se aumentó varias veces más que la cantidad sin él. El monto de la conexión en nuestro servidor Websphere que contiene la aplicación fue de 4 por un usuario antes de las transacciones read_uncommitted y luego se convirtió en 80. ¿Es eso normal? ¿O debería buscar algo más y encontrar el problema en otro lugar? – CntkCtn

2

Puede hacer el "con (nolock)" si vas nativa. Esto es extremo, pero si la alternativa es cambiar el nivel de aislamiento de la transacción, quizás prefiera hacer esto.

Tenga en cuenta que este ejemplo es para MSSQL.

String sqlQueryString = "SELECT * FROM my_classes_table WITH (nolock) WHERE columnName = :columnValue"; 

SQLQuery sqlQuery= session.createSQLQuery(sqlQueryString).addEntity(MyClass.class); 
sqlQuery.setLong("columnValue", value); 
List<MyClass> out = sqlQuery.list(); 
Cuestiones relacionadas