Oracle
 sql >> Database >  >> RDS >> Oracle

Come evitare che due thread diversi leggano le stesse righe da DB (Hibernate e Oracle 10g)

Devi usare PESSIMISTIC_WRITE al momento dell'interrogazione:

Query q = session
    .createQuery("from MyObject n where n.state = 'NEW'")
    .setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();

È sufficiente bloccare gli oggetti principali. I deadlock non si verificheranno necessariamente. Potresti ottenere un errore di acquisizione del blocco se il thread che mantiene il blocco non lo rilascia prima che un altro thread scada dall'attesa.

Dato che stai usando Oracle, ecco come SELEZIONA PER AGGIORNARE funziona:

Quindi, se T1 ha acquisito un blocco esclusivo su alcune righe, T2 non sarà in grado di leggere quei record fino a quando T1 non esegue il commit o il rollback. Se T2 utilizzava un READ_UNCOMMITTED livello di isolamento, quindi T2 non bloccherà mai i record di blocco, poiché utilizza semplicemente i registri di annullamento per ricostruire i dati come se fossero quando è iniziata la query. A differenza dello standard SQL, Oracle READ_UNCOMMITTED: