2012-11-26 34 views
16

Với JPA, chúng tôi có thể sử dụng thủ công OPTIMISTIC hoặc PESSIMISTIC khóa để xử lý các thay đổi thực thể trong giao dịch.JPA và chế độ khóa mặc định

Tôi tự hỏi cách JPA xử lý khóa nếu chúng tôi không chỉ định một trong hai chế độ này? Không sử dụng chế độ khóa nào?

Nếu chúng tôi không xác định chế độ khóa rõ ràng, toàn bộ cơ sở dữ liệu có bị mất không?

Cảm ơn

Trả lời

13

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 ?

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à .

+0

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 –

9

Do JPA 2.1 FR

3,2 Version Thuộc tính

Phiên bản lĩnh hay tài sản được sử dụng bởi các nhà cung cấp kiên trì để thực hiện khóa lạc quan. Nó được truy cập và/hoặc được thiết lập bởi nhà cung cấp persistence trong quá trình thực hiện các hoạt động vòng đời trên cá thể thực thể. Một thực thể được tự động bật để khóa lạc quan nếu nó có thuộc tính hoặc trường được ánh xạ với ánh xạ Phiên bản.

Vì vậy, nếu thực thể là đối tượng được phiên bản, chẳng hạn như @Version đã được chỉ định, thì nhà cung cấp kiên trì mặc định sẽ thực hiện khóa lạc quan.

3

Trong persistence_2.0 đặc điểm kỹ thuật, trang 89:

Nếu một đối tượng là phiên bản là nếu không cập nhật hoặc xóa, sau đó thực hiện phải đảm bảo rằng các yêu cầu của LockModeType.OPTIMISTIC_FORCE_INCREMENT được đáp ứng, ngay cả khi không rõ ràng gọi đến EntityManager.lock đã được thực hiện.

0

Mẫu câu trả lời trước đó gửi ở đây, nó có vẻ như JPA cư xử theo cách sau: Nếu pháp nhân của tôi có một @version chú thích lĩnh vực một không LockModeType đã được thiết lập, sau đó LockModeType.OPTIMISTIC_FORCE_INCREMENT sẽ được thiết lập theo mặc định. Điều này có đúng không?

Các vấn đề liên quan