Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment éviter que deux threads différents lisent les mêmes lignes à partir de la base de données (Hibernate et Oracle 10g)

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 :