2010-06-12 28 views
9

Tôi đang truy xuất danh sách các đối tượng trong chế độ ngủ đông sử dụng API tiêu chí. Tuy nhiên tôi cần khóa trên các đối tượng như một thread thực hiện cùng một lúc sẽ nhận được các đối tượng chính xác và chỉ có một trong những chủ đề sẽ thành công trong trường hợp không có một khóa bi quan.Làm cách nào để chỉ định khóa bi quan với API tiêu chí?

Tôi đã thử như bên dưới, nhưng nó không hoạt động.

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

Cập nhật: Tôi đang thực hiện một bản cập nhật sau tuyên bố này, vì vậy mà tôi muốn cả hai bài đọc hàng khác nhau hoặc ít nhất là thứ hai thread nên đợi cho đến khi thread đầu tiên hoàn thành với các giao dịch và rời khỏi khóa.

Và truy vấn được tạo ngủ đông được đặt bên dưới.

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 ? 

Cập nhật: Có vẻ như một lỗi trong phiên bản 3.5.2 như Pascal Thivent (Thanks a lot Pascal) đã đề cập, tôi đã tham gia làm thành viên và quan sát vấn đề này. Hy vọng rằng nó sẽ được đưa vào bản phát hành tiếp theo.

Tuy nhiên, tôi đã thử sử dụng cách tiếp cận khác tại đây với session.buildLockRequest() ... nhưng tôi không thể tìm ra cách sử dụng nó và sử dụng mã bên dưới không có hiệu ứng nào cả.

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

Bạn có ý nghĩa gì khi "không hoạt động"? AFAIK mà không cần khóa cả hai lần đọc nên thành công. –

+0

@ Péter, đã cập nhật câu hỏi của tôi. Về cơ bản tôi muốn thực hiện cập nhật sau khi lựa chọn này. – Reddy

Trả lời

3

Bạn đang sử dụng phiên bản Hibernate nào? Đây có phải là HHH-5275 không? Bạn có chắc chắn rằng câu lệnh FOR UPDATE không được tạo không? Bạn có thể hiển thị SQL được tạo không?

+0

Đây là truy vấn được tạo ra bởi hibernate (Phiên bản: 3.5.2 Final) Và có, điều này có vẻ như HHH-5275, vậy điều này có nghĩa là chúng ta phải đợi đến phiên bản tiếp theo? :( Hibernate: chọn this_.id là id1_0_, this_.name là name1_0_, this_.orderitem_id là orderitem3_1_0_, this_.status là status1_0_, this_.store là store1_0_, this_.vendor là vendor1_0_, this_.version dưới dạng version1_0_ từ reddy_pool this_ nơi this_.status =? và và this_.name =? order by this..id asc limit? – Reddy

+0

Cảm ơn Pascal Tôi đã thử một cách tiếp cận khác để sử dụng phiên để đặt khóa (xem cập nhật thứ hai trong câu hỏi của tôi) nhưng nó không hoạt động – Reddy

+0

Tôi đã phải trao đổi các truy vấn tiêu chí của tôi cũng vì vấn đề này.Nó có vẻ như một vấn đề lớn - tại sao HH-5275 được ghi nhận là nhỏ? –

Các vấn đề liên quan