Tôi đã đọc bài viết Locking and Concurrency in Java Persistence 2.0 và chạy ứng dụng mẫu. Nhưng tôi vẫn không thể nhận ra sự khác biệt giữa PESSIMISTIC_READ và PESSIMISTIC_WRITE. Tôi đã cố sửa đổi mã và nơi mã sử dụng PESSIMISTIC_READ và PESSIMISTIC_WRITE sẽ có cùng kết quả là sql sẽ được gọi với "để cập nhật".Sự khác nhau giữa PESSIMISTIC_READ và PESSIMISTIC_WRITE trong JPA là gì?
Trả lời
Một là khóa đọc và khóa kia là khóa ghi hoặc trong lần đọc hoặc cập nhật tương ứng.
FTA:
PESSIMISTIC_READ. Trình quản lý đối tượng khóa thực thể ngay sau khi giao dịch đọc nó. Khóa được giữ cho đến khi giao dịch hoàn tất. Chế độ khóa này được sử dụng khi bạn muốn truy vấn dữ liệu bằng cách sử dụng các ngữ nghĩa có thể đọc lặp lại . Nói cách khác, bạn muốn để đảm bảo rằng dữ liệu không phải là được cập nhật giữa lần đọc liên tiếp. Chế độ khóa này không chặn các giao dịch khác đọc dữ liệu.
PESSIMISTIC_WRITE. Trình quản lý đối tượng khóa thực thể ngay sau khi giao dịch cập nhật. Khóa này chế độ buộc tuần tự hóa trong số các giao dịch cố gắng cập nhật dữ liệu thực thể . Chế độ khóa này thường là được sử dụng khi có khả năng cao lỗi cập nhật trong số các giao dịch đồng thời cập nhật.
Thông số cho phép triển khai JPA sử dụng loại khóa cơ sở dữ liệu khác nhau cho từng loại. Hầu hết các cơ sở dữ liệu chỉ có một loại khóa khai báo, vì vậy trong hầu hết các triển khai, hai cơ sở dữ liệu giống nhau (không có sự khác biệt).
Sự khác biệt nằm trong cơ chế khóa.
khóa PESSIMISTIC_READ
có nghĩa là đọc không đọc và đọc không lặp lại là không thể khi bạn có khóa như vậy. Nếu cần thay đổi dữ liệu, cần có PESSIMISTIC_WRITE
khóa
PESSIMISTIC_WRITE
đảm bảo rằng bên cạnh đọc không đọc được và không thể lặp lại (không thể lấy thêm khóa (và có thể deadlocks
trong khi chờ khóa độc quyền).
╔══════════════════════╦══════════════════════════╦══════════════════════════╗
║ LockModeType ║ PESSIMISTIC_READ ║ PESSIMISTIC_WRITE ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ type ║ SHARED LOCK ║ EXCLUSIVE LOCK ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ isReadOnly without ║ ║ ║
║ additional locks ║ YES ║ NO ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ dirty reads ║ NO ║ NO ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ non-repeatable reads ║ NO ║ NO ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ how to update data ║ obtain PESSIMISTIC_WRITE ║ ALLOWED ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ ║ no one holds ║ no one holds ║
║ how to obtain lock ║ PESSIMISTIC_WRITE ║ PESSIMISTIC_READ or ║
║ ║ ║ PESSIMISTIC_WRITE ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ ║ ║ when there is a high ║
║ ║ you want to ensure no ║ likelihood of deadlock or║
║ when to use ║ dirty or non-repeatable ║ update failure among ║
║ ║ reads are possible ║ concurrent updating ║
║ ║ ║ transactions ║
╚══════════════════════╩══════════════════════════╩══════════════════════════╝
Resources:
Các PESSIMISTIC_READ
mua lại một chia sẻ (đọc) khóa trên bảng ghi hàng liên quan, trong khi PESSIMISTIC_WRITE
mua lại một (ghi) khóa độc quyền.
Khóa chia sẻ chặn bất kỳ yêu cầu khóa độc quyền đồng thời nào khác, nhưng nó cho phép các yêu cầu khóa được chia sẻ khác tiếp tục.
Khóa độc quyền chặn cả yêu cầu khóa được chia sẻ và độc quyền.
Điều đáng nói là, đối với Hibernate, nếu cơ sở dữ liệu không hỗ trợ khóa chia sẻ (ví dụ: Oracle), thì yêu cầu khóa được chia sẻ (PESSIMISTIC_READ
) sẽ chỉ yêu cầu khóa độc quyền (PESSIMISTIC_WRITE
).
Để biết thêm chi tiết, hãy xem this article about locks và this article about JPA pessimistic lock types.
- 1. Sự khác nhau giữa JPA và JPA2
- 2. Trong Python, sự khác nhau giữa ".append()" và "+ = []" là gì?
- 3. Sự khác nhau giữa == và = trong Prolog là gì?
- 4. Sự khác nhau giữa // và /// trong Visual Studio là gì?
- 5. Sự khác nhau giữa: = và + = trong tạo tệp là gì?
- 6. Sự khác nhau giữa * và. * Trong MATLAB là gì?
- 7. Sự khác nhau giữa $ @ và $ * trong UNIX là gì?
- 8. Sự khác nhau giữa: = và = trong MySQL là gì?
- 9. Sự khác nhau giữa "||" là gì và "hoặc" trong Perl?
- 10. Sự khác nhau giữa 'eq' và '= ~' trong Perl là gì?
- 11. Sự khác nhau giữa 'và #' trong Lisp là gì?
- 12. sự giống nhau và khác biệt giữa jpa và hibernate
- 13. Sự khác nhau giữa Hibernate và Hibernate JPA
- 14. Sự khác nhau giữa VCS và SCM là gì?
- 15. Sự khác nhau giữa ssize_t và ptrdiff_t là gì?
- 16. Sự khác nhau giữa java.lang.Math và java.lang.StrictMath là gì?
- 17. Sự khác nhau giữa static_cast và reinterpret_cast là gì?
- 18. Sự khác nhau giữa init() và window.init() là gì?
- 19. Sự khác nhau giữa fancyLocalization và preferredLanguage là gì?
- 20. Sự khác nhau giữa CreateObject và Wscript.CreateObject là gì?
- 21. Sự khác nhau giữa CellClick và CellMouseClick là gì?
- 22. Sự khác nhau giữa -0 và 0 là gì?
- 23. Sự khác nhau giữa TCHAR và WCHAR là gì?
- 24. Sự khác nhau giữa `DialogInterface.dismiss()` và `DialogInterface.cancel()` là gì?
- 25. Sự khác nhau giữa fill_parent và wrap_content là gì?
- 26. Sự khác nhau giữa IDbSet.Add và DbEntityEntry.State = EntityState.Added là gì?
- 27. Sự khác nhau giữa SqlCommand.CommandTimeout và SqlConnection.ConnectionTimeout là gì?
- 28. Sự khác nhau giữa NSImage và UIImage là gì?
- 29. Sự khác nhau giữa session.commit() và session.flush() là gì?
- 30. sự khác nhau giữa CONTENT_FILTER_URI và CONTENT_URI là gì?
cảm ơn, tôi đã thấy mô tả, nhưng nó vẫn làm tôi bối rối. Khi tôi sử dụng PESSIMISTIC_READ và PESSIMISTIC_WRITE, nó luôn nhận được kết quả tương tự trong "show sql" và kết quả đang chạy. – paka
Giải thích tuyệt vời !. Bạn có thể vui lòng thêm một số mã mẫu để chứng minh không? – Velu
@paka: thông số JPA cho biết: "Được phép thực hiện để sử dụng LockModeType.PESSIMISTIC_WRITE trong đó LockModeType.PESSIMISTIC_READ được yêu cầu, nhưng không được ngược lại". xem [câu trả lời này] (http://stackoverflow.com/a/33081311/3994580) để biết chi tiết – DaniEll