Bạn cần sử dụng PESSIMISTIC_WRITE
tại thời điểm truy vấn:
Query q = session
.createQuery("from MyObject n where n.state = 'NEW'")
.setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();
Khóa các đối tượng cha là đủ. Bế tắc sẽ không nhất thiết xảy ra. Bạn có thể gặp lỗi thu thập khóa nếu chuỗi giữ khóa không nhả nó ra trước khi chuỗi khác hết thời gian chờ.
Vì bạn đang sử dụng Oracle, đây là cách CHỌN CẬP NHẬT hoạt động:
Vì vậy, nếu T1 có được một khóa độc quyền trên một số hàng, T2 sẽ không thể đọc các bản ghi đó cho đến khi T1 cam kết hoặc quay lại. Nếu T2 sử dụng READ_UNCOMMITTED mức cô lập, thì T2 sẽ không bao giờ chặn trên các bản ghi khóa, vì nó chỉ đơn giản sử dụng các bản ghi hoàn tác để cấu trúc lại dữ liệu như khi bắt đầu truy vấn. Trái ngược với tiêu chuẩn SQL, Oracle READ_UNCOMMITTED sẽ: