Musisz użyć PESSIMISTIC_WRITE
w czasie zapytania:
Query q = session
.createQuery("from MyObject n where n.state = 'NEW'")
.setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();
Wystarczy zablokować obiekty nadrzędne. Zakleszczenia niekoniecznie wystąpią. Może wystąpić niepowodzenie pozyskiwania blokady, jeśli wątek trzymający blokadę nie zwolni jej przed upływem czasu oczekiwania przez inny wątek.
Ponieważ używasz Oracle, w ten sposób WYBIERZ DO AKTUALIZACJI działa:
Więc jeśli T1 uzyskał wyłączną blokadę w niektórych wierszach, T2 nie będzie w stanie odczytać tych rekordów, dopóki T1 nie zatwierdzi lub nie wycofa. Jeśli T2 użył READ_UNCOMMITTED poziom izolacji, wtedy T2 nigdy nie będzie blokować rekordów blokady, ponieważ po prostu używa dzienników cofania do rekonstrukcji danych tak, jakby były w momencie rozpoczęcia zapytania. W przeciwieństwie do standardu SQL, Oracle READ_UNCOMMITTED: