2010-03-02 26 views
5

Tôi đang sử dụng triển khai EclipseLink của JPA 2.0 cho phép khóa bi quan. Tôi biết cách khóa một thực thể nhưng làm cách nào để giải phóng khóa? Lúc đầu, tôi nghĩ rằng đây là tất cả được chăm sóc trong một giao dịch (nói cách khác, các thực thể bị khóa cho đến khi bạn cam kết giao dịch), nhưng điều đó dường như không phải là trường hợp.Làm thế nào để phát hành một hàng bị khóa bằng cách sử dụng JPA?

tôi đã cố gắng tìm kiếm google nhanh chóng (có vẻ như thế này nên được khá rõ ràng), nhưng tôi đã không tìm thấy bất cứ điều gì ...

Trả lời

9

Sau khi nhận được một số giấc ngủ ... và làm một số xét nghiệm hơn vào buổi sáng, Tôi tin rằng tôi đã tìm ra được vấn đề của mình. Vì vậy, khóa thực sự được xử lý trong một giao dịch. Tuy nhiên, khi tôi đang thử nghiệm mã của mình, tôi đã có thể truy xuất một hàng bị khóa bằng phương thức EntityManager.find (lớp, khóa) (không có chiến lược khóa nào được chỉ định). Tôi đã lầm tưởng rằng bằng cách đặt một khóa trên một hàng, hàng không thể đọc được. Giai đoạn. Tuy nhiên, tôi đọc lại các định nghĩa JPA của PESSIMISTIC_READ và PESSIMISTIC_WRITE và nhận thấy vấn đề của tôi:

PESSIMISTIC_READ - Entity bị khóa trên cơ sở dữ liệu, ngăn chặn bất kỳ giao dịch khác từ mua một khóa PESSIMISTIC_WRITE. PESSIMISTIC_WRITE - Thực thể bị khóa trên cơ sở dữ liệu, ngăn chặn bất kỳ giao dịch nào khác từ có được khóa PESSIMISTIC_READ hoặc PESSIMISTIC_WRITE.

Khóa không nhất thiết ngăn chặn tất cả các lần đọc, nó chỉ ngăn giao dịch khác đặt khóa READ hoặc WRITE trên hàng.

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