2010-08-17 14 views

risposta

8

Se davvero bisogno di questo, allora si vuole fare qualcosa di simile:

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

che è identico a un NOLOCK.

Prima di farlo, pensa davvero attentamente se vuoi fare una lettura sporca. La maggior parte delle volte le persone lo fanno perché è quello che hanno sempre fatto, piuttosto che perché è la cosa giusta da fare. In particolare, questo non funziona bene con il caching.

In realtà, this thread entra un po 'nei problemi. Leggere attentamente prima di decidere.

+0

Grazie, Gary. Sì, stavo cercando letture sporche. I nostri DBA hanno raccomandato NOLOCK per tutti i "seleziona" in quest'area del progetto. I problemi erano, parte degli SQL erano ibernati. – Sarit

+2

Nelle ultime versioni di Hibernate, connection() sembra essere rimosso dall'API. Qualche idea su come un effetto simile può essere ottenuto senza oggetto di connessione? –

+1

Se si utilizza l'annotazione '@ Transactional', può essere specificata come' isolation'-property. – Tobb

5

Nella versione più recente di Hibernate si deve fare in questo modo:

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

Ho usato questo metodo per impostare i livelli di isolamento della transazione read_uncommitted su alcune query, ma mi sono reso conto che l'importo della connessione è stato aumentato più volte di più della quantità senza di essa. L'ammontare della connessione sul nostro server Websphere che contiene l'applicazione era 4 per un utente prima di read_uncommitted transaction e dopo è diventato come 80. È normale? O dovrei cercare qualcos'altro e da qualche altra parte per trovare il problema? – CntkCtn

2

Si può fare il "con (nolock)" se si va nativo. Questo è estremo ma se l'alternativa sta cambiando il livello di isolamento della transazione, potresti farlo.

Si noti che questo esempio è per 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(); 
Problemi correlati