PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Spring Data Pessimistic Lock timeout with Postgres

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để cấu hình Cơ sở dữ liệu PostgreSQL?

  2. Chi phí công khai PostgreSQL miễn phí

  3. Postgres thêm cột với các giá trị được tính toán ban đầu

  4. Làm cách nào để chia kết quả truy vấn thành các cột riêng biệt?

  5. Làm cách nào để thay đổi ID bảng từ nối tiếp sang danh tính?