2010-06-12 6 views
9

Ich bin eine Liste von Objekten in Hibernate Abrufen Criteria API. Allerdings muss ich diese Objekte sperren, da ein anderer Thread, der zur gleichen Zeit ausgeführt wird, die genauen Objekte erhält und nur einer der Threads in Abwesenheit einer pessimistischen Sperre erfolgreich ist.Wie pessimistische Sperre mit Kriterien-API angeben?

Ich versuchte, wie unten, aber es funktioniert nicht.

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(); 

aktualisieren: Ich bin ein Update nach dieser Anweisung durchgeführt wird, so dass ich beiden Fäden unterschiedliche möchte Reihen oder zumindest zweiten Thread sollte warten, bis erster Thread abgeschlossen mit der Transaktion und verläßt das Schloss lesen.

Und die Hibernate generierte Abfrage ist unten.

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 ? 

aktualisieren: Es scheint ein Fehler in 3.5.2 Version als Pascal Thivent (Vielen Dank Pascal) erwähnt, habe ich als Mitglied und beobachten das Problem verbunden. Hoffentlich wird es in der nächsten Version enthalten sein.

Allerdings habe ich versucht, einen anderen Ansatz hier mit session.buildLockRequest() ... aber ich konnte nicht ganz herausfinden, wie man es benutzt und die Verwendung von unten Code hat keine Wirkung überhaupt.

for (int i=0; i < n; i++) 
    session.buildLockRequest(LockOptions.UPGRADE).lock(esns.get(i)); 
+0

Was meinst du mit „funktioniert nicht“? AFAIK ohne Sperren beide Lesevorgänge sollten erfolgreich sein. –

+0

@ Péter, aktualisiert meine Frage. Grundsätzlich möchte ich nach dieser Auswahl ein Update durchführen. Diese – Reddy

Antwort

3

Welche Version von Hibernate verwenden Sie? Könnte das HHH-5275 sein? Sind Sie sicher, dass die FOR UPDATE-Anweisung nicht generiert wird? Können Sie das generierte SQL anzeigen?

+0

ist die Abfrage generiert durch Hibernate (Version: 3.5.2 Final) Und ja, dies scheint wie HHH-5275, so bedeutet dies bedeutet, dass wir bis zum nächsten Version warten müssen? :( Hibernate: wähle this_.id als id1_0_, this_.name als name1_0_, this_.orderitem_id als orderitem3_1_0_, this_.status als status1_0_, this_.store als store1_0_, this_.vendor als vendor1_0_, this_.version als version1_0_ from reddy_pool this_ wo this_.status =? und und this_.name = Bestellung von this_.id asc Grenze? – Reddy

+0

Dank Pascal. ich einen anderen Ansatz versucht haben Sitzung zu verwenden Sperre zu setzen (zweite Update in meiner Frage sehen), aber es funktioniert nicht – Reddy

+0

Ich musste meine Kriterien-Abfrage auch wegen dieses Problems austauschen.Es scheint wie eine große Sache - warum ist HH-5275 als geringfügig notiert? –