2010-08-17 7 views

Répondre

8

Si vous avez vraiment besoin de cela, alors que vous voulez faire quelque chose comme:

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

qui est identique à un nolock.

Avant de faire cela, pensez vraiment sérieusement si vous voulez faire une lecture sale. La plupart du temps, les gens font cela parce que c'est ce qu'ils ont toujours fait, plutôt que parce que c'est la bonne chose à faire. En particulier, cela ne fonctionne pas bien avec la mise en cache.

En fait, this thread va un peu dans les problèmes. Lisez attentivement avant de décider.

+0

Merci, Gary. Oui, je cherchais des lectures sales. Nos DBA ont recommandé NOLOCK pour tous les "sélects" dans cette zone du projet. Les problèmes étaient, une partie des SQLs étaient hibernate. – Sarit

+2

Dans les dernières versions d'Hibernate, connection() semble être retiré de l'API. Des idées sur la façon dont un effet similaire peut être obtenu sans objet de connexion? –

+1

Si vous utilisez l'annotation '@ Transactional', elle peut être spécifiée comme propriété' isolation'. – Tobb

5

Dans la dernière version de mise en veille prolongée, vous devez le faire de cette façon:

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

J'ai utilisé cette méthode pour définir des niveaux d'isolation de transaction read_uncommitted sur certaines requêtes, mais je me suis rendu compte que le montant de la connexion a été augmenté plusieurs fois plus que le montant sans connexion. Le montant de la connexion sur notre serveur Websphere qui contient l'application était 4 pour un utilisateur avant les transactions read_uncommitted et ensuite il est devenu 80. Est-ce normal? Ou devrais-je chercher autre chose et ailleurs pour trouver le problème? – CntkCtn

2

Vous pouvez faire « avec (nolock) » si vous allez natif. C'est extrême mais si l'alternative change le niveau d'isolation de la transaction, vous pourriez plutôt le faire.

Notez que cet exemple est pour 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();