Vous devez utiliser PESSIMISTIC_WRITE
au moment de la requête :
Query q = session
.createQuery("from MyObject n where n.state = 'NEW'")
.setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();
Le verrouillage des objets parents est suffisant. Les impasses ne se produiront pas nécessairement. Vous pouvez obtenir un échec d'acquisition de verrou si le thread qui détient le verrou ne le libère pas avant qu'un autre thread n'expire.
Puisque vous utilisez Oracle, voici comment SÉLECTIONNER POUR LA MISE À JOUR fonctionne :
Ainsi, si T1 a acquis un verrou exclusif sur certaines lignes, T2 ne pourra pas lire ces enregistrements tant que T1 n'aura pas validé ou annulé. Si T2 a utilisé un READ_UNCOMMITTED niveau d'isolement, alors T2 ne bloquera jamais les enregistrements de verrouillage, car il utilise simplement les journaux d'annulation pour reconstruire les données comme si elles étaient au début de la requête. Contrairement au standard SQL, Oracle READ_UNCOMMITTED va :