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));
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. –
@ 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