sql >> Base de Datos >  >> RDS >> Oracle

Cómo evitar que dos subprocesos diferentes lean las mismas filas de DB (Hibernate y Oracle 10g)

Necesitas usar PESSIMISTIC_WRITE en el momento de la 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 los objetos principales es suficiente. Los interbloqueos no necesariamente ocurrirán. Es posible que obtenga un error de adquisición de bloqueo si el subproceso que contiene el bloqueo no lo libera antes de que otro subproceso agote el tiempo de espera.

Ya que está usando Oracle, así es como SELECCIONAR PARA ACTUALIZAR funciona:

Entonces, si T1 adquirió un bloqueo exclusivo en algunas filas, T2 no podrá leer esos registros hasta que T1 confirme o retroceda. Si T2 usó un READ_UNCOMMITTED nivel de aislamiento, entonces T2 nunca bloqueará los registros de bloqueo, ya que simplemente usa los registros de deshacer para reconstruir los datos como si estuvieran cuando comenzó la consulta. A diferencia del estándar SQL, Oracle READ_UNCOMMITTED: