2010-06-12 18 views
9

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)); 
+0

¿Qué quiere decir con "no funciona"? AFAIK sin bloqueos, ambas lecturas deberían tener éxito. –

+0

@ Péter, actualicé mi pregunta. Básicamente quiero realizar una actualización después de esta selección. – Reddy

Respuesta

3

¿Qué versión de Hibernate estás utilizando? ¿Podría ser HHH-5275? ¿Estás seguro de que no se genera la declaración FOR UPDATE? ¿Puedes mostrar el SQL generado?

+0

Esta es la consulta generada por hibernate (Versión: 3.5.2 Final) Y sí, parece HHH-5275, ¿significa que tenemos que esperar hasta la próxima versión? :( Hibernate: seleccione this_.id como id1_0_, this_.name como name1_0_, this_.orderitem_id como orderitem3_1_0_, this_.status como status1_0_, this_.store como store1_0_, this_.vendor como vendor1_0_, this_.version como version1_0_ de reddy_pool this_ donde this_.status =? yy este_.nombre =? orden por this_.id límite de asc? – Reddy

+0

Gracias Pascal. He intentado otro enfoque para usar la sesión para colocar el bloqueo (ver la segunda actualización en mi pregunta) pero no está funcionando también. – Reddy

+0

Tuve que cambiar mi consulta de criterios también debido a este problema. Parece un gran problema, ¿por qué HH-5275 se menciona como menor? –

Cuestiones relacionadas