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

Tại sao tôi bi quan Khóa JPA với Oracle không hoạt động

Cuối cùng, tôi đã cố gắng làm cho nó hoạt động nhưng với một số sửa đổi. Ý tưởng là sử dụng LockModeType.PESSIMISTIC_FORCE_INCREMENT thay vì PESSIMISTIC_WRITE. Sử dụng chế độ khóa này, Cron Jobs hoạt động như sau:

  1. Khi công việc đầu tiên thực hiện lựa chọn cập nhật, mọi thứ diễn ra như mong đợi nhưng phiên bản trên đối tượng thay đổi.
  2. Nếu một công việc khác cố gắng thực hiện cùng một lựa chọn trong khi công việc đầu tiên vẫn còn trong giao dịch của nó, JPA sẽ khởi chạy OptimisticLockException để nếu bạn bắt gặp ngoại lệ đó, bạn có thể chắc chắn rằng nó đã bị khóa để đọc.

Giải pháp này có các đối tác khác nhau:

  1. SynchronizedCronJobTask phải có trường phiên bản và được kiểm soát phiên bản với @Version
  2. Bạn cần xử lý OptimisticLockException và nó phải được bắt bên ngoài phương thức dịch vụ giao dịch để thực hiện khôi phục khi quá trình khóa xảy ra.
  3. IMHO là một giải pháp không thanh lịch, tệ hơn nhiều so với việc chỉ đơn giản là một chiếc ổ khóa nơi Công việc của Cron đợi các Công việc trước đó hoàn thành.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:Làm thế nào để nhóm theo một phạm vi?

  2. Sự khác biệt giữa biến ràng buộc và biến thay thế (mà tôi nhập bằng cách sử dụng &&) là gì?

  3. Kết nối với Cơ sở dữ liệu Oracle thông qua C #?

  4. Cách tạo dấu vết FRD trong Oracle Apps 11i / R12

  5. Tạo trình kích hoạt cập nhật một cột trên một bảng khi một cột trong bảng khác được cập nhật