Kriterler API'sini kullanarak hazırda beklemedeki nesnelerin listesini alıyorum. Ancak, bu nesneler üzerinde kilitlemeye ihtiyacım var, aynı anda yürüten başka bir iş parçacığı tam olarak nesneler alır ve iş parçacığının yalnızca biri, kötümser bir kilidin yokluğunda başarılı olur.Kriter API'sı ile kötümser kilit nasıl belirlenir?
Aşağıdaki gibi denedim, ancak çalışmıyor.
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();
Güncelleme: Her iki konu farklı satırları okumak veya birinci iplik işlemle tamamlar ve kilit gidene kadar en az ikinci iplik beklemesi gerektiğini istiyorum ki ben bu ifadeye sonra bir güncelleme yapıyorum.
Hazırda bekletilen sorgu aşağıdaki gibidir.
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 ?
Güncelleme: Pascal Thivent sözü (çok Pascal teşekkür) olarak 3.5.2 sürümünde bir hata, ben üye ve konuyu izlemek gibi katıldı görünüyor. Umarım bir sonraki sürümde yer alacaktır.
Ancak burada session.buildLockRequest()
ile başka bir yaklaşım kullanmayı denedim ... ama nasıl kullanacağımı anlayamadım ve aşağıdaki kodu kullanmanın hiç bir etkisi yok.
for (int i=0; i < n; i++)
session.buildLockRequest(LockOptions.UPGRADE).lock(esns.get(i));
"Çalışmıyor" ile ne demek istiyorsun? Her iki okuru da kilitlemeden AFAIK başarılı olmalı. –
@ Péter, sorumu güncelledi. Temel olarak bu seçimden sonra güncelleme yapmak istiyorum. – Reddy