2010-06-12 19 views
9

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

"Çalışmıyor" ile ne demek istiyorsun? Her iki okuru da kilitlemeden AFAIK başarılı olmalı. –

+0

@ Péter, sorumu güncelledi. Temel olarak bu seçimden sonra güncelleme yapmak istiyorum. – Reddy

cevap

3

Ne tür bir hazırda bekletme kullanıyorsunuz? Bu HHH-5275 olabilir mi? FOR UPDATE ifadesinin oluşturulmadığından emin misiniz? Oluşturulan SQL'i gösterebilir misin?

+0

Bu hazırda bekletme tarafından oluşturulan sorgu (Sürüm: 3.5.2 Son) Ve evet, bu HHH-5275 gibi görünüyor, bu yüzden bir sonraki sürüme kadar beklemek zorundayız demektir? :( Hazırda bekletme: this_.id id1_0_, name1_0_ olarak this_.id, orderitem3_1_0_ olarak this_.orderitem_id, status1_0_ olarak this_.status, store1_0_ olarak this_.store, vendor1_0_ olarak this_.vendor'u reddy_pool'dan version1_0_ olarak this_.version olarak seçin. this_ burada this_.status =? ve this_.name =? order this_.id asc limitine göre – Reddy

+0

Teşekkürler Pascal. Kilitlemek için oturumu kullanmak için başka bir yaklaşım denedim (sorgumda ikinci güncellemeye bakın) ama çalışmıyor – Reddy

+0

Bu sorun nedeniyle benim de kriterini sorgulamak zorunda kaldım.Büyük bir anlaşma gibi görünüyor - neden HH-5275 minör olarak belirtiliyor? –