Je récupère une liste d'objets dans Hibernate en utilisant l'API Criteria. Cependant j'ai besoin de verrouiller sur ces objets car un autre thread s'exécutant en même temps obtiendra les objets exacts et seul un des threads réussira en l'absence d'un verrou pessimiste.Comment spécifier un verrou pessimiste avec l'API Criteria?
J'ai essayé comme ci-dessous, mais cela ne fonctionne pas.
List esns = session
.createCriteria(Reddy_Pool.class)
.add(Restrictions.eq("status", "AVAILABLE"))
.add(Restrictions.eq("name", "REDDY2"))
.addOrder(Order.asc("id"))
.setMaxResults(n)
.setLockMode(LockMode.PESSIMISTIC_WRITE) //not working at all
.list();
Mise à jour: Je suis d'effectuer une mise à jour après cette déclaration, de sorte que je voudrais les deux fils de lire des lignes différentes ou au moins deuxième fil devrait attendre premier thread termine avec la transaction et laisse le verrou.
Et la requête générée par hibernate est ci-dessous.
Hibernate: select this_.id as id1_0_, this_.name as name1_0_,
this_.orderitem_id as orderitem3_1_0_, this_.status as status1_0_,
this_.store as store1_0_, this_.vendor as vendor1_0_, this_.version as version1_0_
from reddy_pool this_
where this_.status=? and and this_.name=? order by this_.id asc limit ?
Mise à jour: Il semble un bug dans la version 3.5.2 comme Pascal Thivent (Merci beaucoup Pascal) a mentionné, je l'ai rejoint en tant que membre et en regardant la question. Espérons qu'il sera inclus dans la prochaine version.
Cependant, j'ai essayé d'utiliser une autre approche ici avec session.buildLockRequest()
... mais je n'arrivais pas à comprendre comment l'utiliser et utiliser le code ci-dessous n'a aucun effet.
for (int i=0; i < n; i++)
session.buildLockRequest(LockOptions.UPGRADE).lock(esns.get(i));
Que voulez-vous dire par "ne fonctionne pas"? AFAIK sans verrous les deux lectures devraient réussir. –
@ Péter, mis à jour ma question. Fondamentalement, je veux effectuer une mise à jour après cette sélection. – Reddy