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));
Was meinst du mit „funktioniert nicht“? AFAIK ohne Sperren beide Lesevorgänge sollten erfolgreich sein. –
@ Péter, aktualisiert meine Frage. Grundsätzlich möchte ich nach dieser Auswahl ein Update durchführen. Diese – Reddy