Tôi đã quét qua phần 3.4.4 Khóa chế độ của đặc tả Java Persistence API 2.0 Final Release và trong khi tôi không thể tìm thấy bất cứ điều gì cụ (nó không nói rằng đây là mặc định hoặc bất cứ điều gì như thế) có một chú thích có nội dung như sau.
Loại chế độ khóa NONE có thể được chỉ định làm giá trị của chế độ khóa đối số và cũng cung cấp giá trị mặc định cho chú thích.
Phần này là về các loại giá trị LockModeType
có sẵn và cách sử dụng của chúng cũng như mô tả phương pháp nào có đối số loại này và không có điều gì.
Vì vậy, như đã nói LockModeType.NONE
là mặc định cho chú thích (JPA, chú thích trái và phải) tôi đoán khi bạn sử dụng EntityManager.find(Class, Object)
mặc định LockModeType
được sử dụng.
Có một số khác, tinh tế, gợi ý để củng cố điều này. Mục 3.1.1 Giao diện EntityManager.
Phương pháp tìm (với điều kiện nó được gọi mà không có một khóa hoặc gọi với LockModeType.NONE) và phương pháp getReference không cần phải được gọi trong một bối cảnh giao dịch.
Có ý nghĩa. Ví dụ nếu bạn sử dụng MySQL làm cơ sở dữ liệu của bạn và cơ sở dữ liệu của bạn là InnoDB thì (theo mặc định) các bảng của bạn sẽ sử dụng REPEATABLE READ
, nếu bạn sử dụng một số RDBMS hoặc các công cụ cơ sở dữ liệu khác, điều này có thể thay đổi. Ngay bây giờ tôi không chắc chắn rằng các mức cô lập có liên quan đến chế độ khóa JPA (mặc dù có vẻ như vậy), nhưng quan điểm của tôi là các hệ thống cơ sở dữ liệu khác nhau nên JPA không thể quyết định cho bạn (tại ít nhất theo đặc điểm kỹ thuật) chế độ khóa nào sẽ sử dụng theo mặc định, vì vậy nó sẽ sử dụng LockModeType.NONE
nếu bạn không hướng dẫn cách khác.
Tôi cũng đã tìm thấy an article regarding isolation levels and lock modes, bạn có thể muốn đọc nó.
Ồ, và để trả lời câu hỏi cuối cùng của bạn.
Nếu chúng tôi không xác định chế độ khóa rõ ràng, cơ sở dữ liệu có thể bị mất toàn vẹn cơ sở dữ liệu ?
Nó phụ thuộc, nhưng nếu bạn có giao dịch đồng thời thì câu trả lời có lẽ là có.
Cảm ơn bạn đã trả lời và liên kết xây dựng này. Tôi sẽ đọc lại và cố gắng hiểu LockModeType.NONE và điều đó ngụ ý. Thực tế là tôi mới với JPA và tôi không konw chính xác những gì thực thể tôi nên khóa để giữ với tính toàn vẹn certitude. Nó có lẽ nhàm chán nhưng tôi sẽ kiểm tra tất cả các chế độ với mô phỏng giao dịch (Thread.sleep()). Cảm ơn một lần nữa –