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

Làm cách nào để chỉ định thời gian chờ @lock trong truy vấn jpa dữ liệu mùa xuân?

Đối với Dữ liệu mùa xuân 1.6 trở lên

@Lock được hỗ trợ trên các phương thức CRUD kể từ phiên bản 1.6 của Spring Data JPA (trên thực tế, đã có mốc quan trọng có sẵn). Xem này để biết thêm chi tiết.

Với phiên bản đó, bạn chỉ cần khai báo như sau:

interface WidgetRepository extends Repository<Widget, Long> {

  @Lock(LockModeType.PESSIMISTIC_WRITE)
  Widget findOne(Long id);
}

Điều này sẽ khiến phần triển khai CRUD của proxy kho lưu trữ sao lưu áp dụng LockModeType đã định cấu hình cho find(…) gọi trên EntityManager .

Mặt khác,

Đối với phiên bản trước của Spring Data 1.6

Dữ liệu mùa xuân bi quan @Lock chú thích chỉ áp dụng (như bạn đã chỉ ra) cho các truy vấn. Không có chú thích nào mà tôi biết có thể ảnh hưởng đến toàn bộ giao dịch. Bạn có thể tạo findByOnePessimistic phương thức gọi findByOne bằng khóa bi quan hoặc bạn có thể thay đổi findByOne để luôn có được một khóa bi quan.

Nếu bạn muốn thực hiện giải pháp của riêng mình, bạn có thể có thể. Dưới mui xe, @Lock chú thích được xử lý bởi LockModePopulatingMethodIntercceptor làm như sau:

TransactionSynchronizationManager.bindResource(method, lockMode == null ? NULL : lockMode);

Bạn có thể tạo một số trình quản lý khóa tĩnh có ThreadLocal<LockMode> biến thành viên và sau đó có một khía cạnh được bao bọc xung quanh mọi phương thức trong mọi kho lưu trữ được gọi là bindResource với chế độ khóa được đặt trong ThreadLocal. Điều này sẽ cho phép bạn đặt chế độ khóa trên cơ sở mỗi luồng. Sau đó, bạn có thể tạo @MethodLockMode của riêng mình chú thích sẽ bao bọc phương thức trong một khía cạnh đặt chế độ khóa dành riêng cho luồng trước khi chạy phương thức và xóa nó sau khi chạy phương thức.

Liên kết tài nguyên:

  1. Làm cách nào để bật LockModeType.PESSIMISTIC_WRITE khi tìm kiếm các thực thể bằng Spring Data JPA?
  2. Cách thêm tùy chỉnh phương thức sang Spring Data JPA
  3. Thời gian chờ Khóa bi quan của Spring Data với Postgres
  4. API truy vấn JPA

Nhiều ví dụ về thời gian chờ khóa bi quan

Đặt khóa bi quan

Một đối tượng thực thể có thể được khóa rõ ràng bằng phương thức khóa:

em.lock(employee, LockModeType.PESSIMISTIC_WRITE);

Đối số đầu tiên là một đối tượng thực thể. Đối số thứ hai là chế độ khóa được yêu cầu.

Một TransactionRequiredException được ném nếu không có giao dịch đang hoạt động khi khóa được gọi vì khóa rõ ràng yêu cầu một giao dịch đang hoạt động.

Một LockTimeoutException được ném nếu không thể cấp khóa bi quan được yêu cầu:

  • Một PESSIMISTIC_READ yêu cầu khóa không thành công nếu người dùng khác (được đại diện bởi một phiên bản EntityManager khác) hiện đang giữ PESSIMISTIC_WRITE khóa đối tượng cơ sở dữ liệu đó.
  • PESSIMISTIC_WRITE yêu cầu khóa không thành công nếu người dùng khác hiện đang sở hữu PESSIMISTIC_WRITE khóa hoặc một PESSIMISTIC_READ khóa đối tượng cơ sở dữ liệu đó.

Đặt gợi ý truy vấn (Phạm vi)

Gợi ý truy vấn có thể được đặt trong các phạm vi sau (từ toàn cầu đến cục bộ):

Đối với toàn bộ đơn vị duy trì - sử dụng persistence.xml tài sản:

<properties>
   <property name="javax.persistence.query.timeout" value="3000"/>
</properties>

Đối với EntityManagerFactory - sử dụng createEntityManagerFacotory phương pháp:

Map<String,Object> properties = new HashMap();
properties.put("javax.persistence.query.timeout", 4000);
EntityManagerFactory emf =
  Persistence.createEntityManagerFactory("pu", properties);

Đối với EntityManager - sử dụng createEntityManager phương pháp:

Map<String,Object> properties = new HashMap();
properties.put("javax.persistence.query.timeout", 5000);
EntityManager em = emf.createEntityManager(properties);

hoặc sử dụng phương thức setProperty:

em.setProperty("javax.persistence.query.timeout", 6000);

Đối với named query định nghĩa - sử dụng hints phần tử:

@NamedQuery(name="Country.findAll", query="SELECT c FROM Country c",
    hints={@QueryHint(name="javax.persistence.query.timeout", value="7000")})

Để thực thi truy vấn cụ thể - sử dụng setHint phương thức (trước khi thực thi truy vấn):

query.setHint("javax.persistence.query.timeout", 8000);

Liên kết tài nguyên:

  1. Khóa trong JPA
  2. Hết thời gian khóa bi quan


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi giữa mệnh đề để kết hợp

  2. Cú pháp kết hợp bên ngoài kiểu cũ Oracle - Tại sao lại định vị dấu (+) ở bên phải của dấu bằng trong phép nối bên ngoài bên trái?

  3. Làm cách nào để sử dụng chỉ mục dựa trên hàm trên một cột có chứa NULL trong Oracle 10+?

  4. Truy vấn Oracle PL / SQL không biên dịch

  5. Nối các bảng với LIKE (SQL)