Estoy recuperando una lista de objetos en hibernación usando la API de Criteria. Sin embargo, necesito bloquear esos objetos ya que otro hilo que se ejecuta al mismo tiempo obtendrá los objetos exactos y solo uno de los hilos tendrá éxito en ausencia de un bloqueo pesimista.¿Cómo especificar el bloqueo pesimista con la API de Criteria?
Lo intenté más abajo, pero no está funcionando.
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();
actualización: Estoy realizando una actualización después de esta declaración, por lo que me gustaría ambos hilos para leer diferentes filas o al menos segundo hilo deben esperar hasta la primera rosca completa con la transacción y deja la cerradura.
Y la consulta generada hibernate está debajo.
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 ?
actualización: Parece un fallo en la versión 3.5.2 como Pascal Thivent (Muchas gracias Pascal) menciona, he incorporado como miembro y ver el tema. Con suerte, se incluirá en la próxima versión.
Sin embargo, traté de usar otro enfoque aquí con session.buildLockRequest()
... pero no pude entender cómo usarlo y usar el siguiente código no está teniendo ningún efecto.
for (int i=0; i < n; i++)
session.buildLockRequest(LockOptions.UPGRADE).lock(esns.get(i));
¿Qué quiere decir con "no funciona"? AFAIK sin bloqueos, ambas lecturas deberían tener éxito. –
@ Péter, actualicé mi pregunta. Básicamente quiero realizar una actualización después de esta selección. – Reddy