Du skal bruge PESSIMISTIC_WRITE
på forespørgselstidspunktet:
Query q = session
.createQuery("from MyObject n where n.state = 'NEW'")
.setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();
Det er tilstrækkeligt at låse de overordnede objekter. Deadlocks vil ikke nødvendigvis forekomme. Du kan få en låseoptagelsesfejl, hvis tråden, der holder låsen, ikke frigiver den før en anden tråd udløber ventetiden.
Da du bruger Oracle, er det sådan VÆLG FOR OPDATERING virker:
Så hvis T1 erhvervede en eksklusiv lås på nogle rækker, vil T2 ikke være i stand til at læse disse poster, før T1 begår eller ruller tilbage. Hvis T2 brugte en READ_UNCOMMITTED isolationsniveau, så vil T2 aldrig blokere for låseposter, da den simpelthen bruger fortryd-logfiler til at rekonstruere data, som om de var, da forespørgslen begyndte. I modsætning til SQL-standarden vil Oracle READ_UNCOMMITTED: