Você precisa usar
PESSIMISTIC_WRITE
na hora da consulta:Query q = session
.createQuery("from MyObject n where n.state = 'NEW'")
.setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();
Bloquear os objetos pai é suficiente. Os impasses não ocorrerão necessariamente. Você pode obter uma falha de aquisição de bloqueio se o encadeamento que mantém o bloqueio não o liberar antes de outro encadeamento de tempo limite de espera.
Como você está usando o Oracle, é assim que SELECIONE PARA ATUALIZAÇÃO funciona:
Portanto, se T1 adquiriu um bloqueio exclusivo em algumas linhas, T2 não poderá ler esses registros até que T1 confirme ou reverta. Se T2 usou um READ_UNCOMMITTED nível de isolamento, o T2 nunca bloqueará registros de bloqueio, pois simplesmente usa logs de desfazer para reconstruir os dados como se estivessem quando a consulta começou. Ao contrário do padrão SQL, o Oracle READ_UNCOMMITTED irá: