javax.persistence.lock.timeout cũng không hoạt động với tôi khi được cung cấp như bên dưới
@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout",value = "15000")})
Nhưng sau đó tôi đã thử một cái gì đó khác hoạt động. Thay vì sử dụng @Repository và sử dụng CrudRepository, bây giờ tôi đang định cấu hình chế độ ngủ đông của mình bằng trình quản lý thực thể. Đã sử dụng createQuery cùng với khóa và cài đặt thời gian chờ khóa. Và cấu hình này đang hoạt động như mong đợi. Tôi có hai giao dịch chạy song song và cố gắng khóa một hàng chính xác trong DB. Giao dịch đầu tiên có thể nhận được khóa WRITE và giữ khóa trong khoảng 10 giây trước khi mở khóa. Trong khi đó, giao dịch thứ hai cố gắng có được khóa trên cùng một hàng nhưng vì javax.persistence.lock.timeout được đặt thành 15 giây, nó sẽ đợi khóa được phát hành và sau đó có được khóa của chính nó. Do đó, làm cho luồng được tuần tự hóa.
@Component
public class Repository {
@PersistenceContext
private EntityManager em;
public Optional<Cache> getById(int id){
List<Cache> list = em.createQuery("select c from Cache c where c.id = ?1")
.setParameter(1, id)
.setHint("javax.persistence.lock.timeout", 15000)
.setLockMode(LockModeType.PESSIMISTIC_WRITE)
.getResultList();
return Optional.ofNullable(list.get(0));
}
public void save(Cache cache) {
cache = em.find(Cache.class, cache.getId());
em.merge(cache);
}
}
Đảm bảo rằng cơ chế khóa này nằm trong một giao dịch vì khóa sẽ được giải phóng khi một giao dịch được cam kết hoặc hoàn nguyên.