Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como evitar que dois threads diferentes leiam as mesmas linhas do DB (Hibernate e Oracle 10g)


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á: