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

Xử lý cập nhật đồng thời ở chế độ ngủ đông

Ai đó có thể giải thích cho tôi nếu chúng tôi sử dụng spring để quản lý giao dịch, thì các bản cập nhật đồng thời sẽ được xử lý như thế nào bằng hibernate (Trong quản lý phiên bản tự động của bộ nhớ của hibernate) hoặc tôi phải đặt cột phiên bản trong cơ sở dữ liệu để xử lý các bản cập nhật đồng thời theo cách thủ công.

Việc bạn có đang sử dụng Spring để quản lý giao dịch hay không không thực sự quan trọng và không liên quan đến quản lý đồng thời, điều này thực sự được xử lý bởi Hibernate. Hibernate có thể sử dụng 2 chiến lược để xử lý các cập nhật đồng thời:khóa lạc quan và khóa bi quan.

Lạc quan

Khi sử dụng khóa lạc quan, bạn ánh xạ một thuộc tính đặc biệt (số, dấu thời gian) dưới dạng phiên bản (vì vậy bạn thực sự có một cột cho nó). Phiên bản này được đọc khi bạn truy xuất một thực thể và được bao gồm trong mệnh đề where trong quá trình cập nhật và tăng dần bởi Hibernate.

Để minh họa cách hoạt động của điều này, hãy tưởng tượng bạn tải một thực thể Person theo id =1 và với phiên bản hiện tại =1. Sau khi lưu, Hibernate sẽ hoạt động như sau:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Vì vậy, bây giờ, hãy tưởng tượng bạn có hai giao dịch đồng thời đang chạy, mỗi giao dịch trong số chúng tải giống nhau thực thể (cùng số phiên bản) và thay đổi tên.

Giả sử giao dịch số 1 được cam kết đầu tiên, truy vấn sau được thực hiện:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Nó thành công và phiên bản được tăng lên.

Sau đó, giao dịch số 2 được cam kết, truy vấn sau được thực hiện:

update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;

Cái này sẽ không cập nhật bất cứ điều gì vì mệnh đề where sẽ không khớp với bất kỳ bản ghi nào. Đây là nơi bạn sẽ nhận được một ngoại lệ đồng thời lạc quan.

Chiến lược này phù hợp khi bạn không duy trì kết nối, khi các truy cập đồng thời không thường xuyên và quy mô thực sự tốt. Và tất nhiên mọi thứ đều được Hibernate xử lý minh bạch cho bạn, miễn là bạn ánh xạ thuộc tính phiên bản.

Bi quan

Khi sử dụng khóa bi quan, Hibernate sẽ khóa một bản ghi cho mục đích sử dụng riêng của bạn cho đến khi bạn hoàn thành nó (thường sử dụng SELECT ... FOR UPDATE ). Bất kỳ giao dịch đồng thời nào khác đang cố gắng truy cập vào cùng một bản ghi sẽ bị tạm ngưng cho đến khi khóa được gỡ bỏ. Chiến lược này mang lại khả năng dự đoán tốt hơn, với giá của hiệu suất và không mở rộng quy mô vô thời hạn.

Tài liệu tham khảo

  • Hướng dẫn Tham khảo Chính về Hibernate
    • 11.3. Kiểm soát đồng thời lạc quan
    • 11.4. 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. Tài liệu Oracle

  2. Oracle có lưu trữ các số 0 ở cuối cho kiểu dữ liệu Số không?

  3. Làm thế nào để hồi tưởng lại khi chúng ta có thẻ dữ liệu

  4. Cơ sở dữ liệu Oracle là gì?

  5. ORA-00054:tài nguyên bận và có được với NOWAIT được chỉ định