Du måste använda PESSIMISTIC_WRITE
vid frågetid:
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 räcker med att låsa föräldraobjekten. Deadlocks kommer inte nödvändigtvis att inträffa. Du kan få ett låsförvärvningsfel om tråden som håller låset inte släpper den innan en annan tråd tar slut i väntan.
Eftersom du använder Oracle är det så här VÄLJ FÖR UPPDATERING fungerar:
Så om T1 fick ett exklusivt lås på vissa rader, kommer T2 inte att kunna läsa dessa poster förrän T1 commits eller återställs. Om T2 använde en READ_UNCOMMITTED isoleringsnivå, då kommer T2 aldrig att blockera låsposter, eftersom den helt enkelt använder ångra loggar för att rekonstruera data som om det var när frågan började. Till skillnad från SQL-standarden kommer Oracle READ_UNCOMMITTED: