2015-06-11 17 views
5

Tôi đã đọc về mức cách ly giao dịch. Nó được sử dụng để ngăn chặn các lỗi thực hiện giao dịch song song. Nó khá rõ ràng. Ngoài ra còn có các chế độ khóa khả dụng cho các thực thể. Tôi hiểu cách họ làm việc.Sự khác biệt JPA giữa cách ly giao dịch và khóa đối tượng

Nhưng tôi không thể tìm thấy lý do tại sao tôi cần khóa? Tôi đã sử dụng mức cô lập giao dịch rồi. Tại sao tôi phải sử dụng khóa? Mức độ cách ly và khóa có thực hiện cùng một công việc không?

+0

khóa cũng có thể ở cấp cơ sở dữ liệu, do đó các hoạt động khác bên ngoài ứng dụng web không sửa đổi dữ liệu cơ sở dữ liệu. –

+0

Vì vậy, khi tôi sử dụng mức cô lập giao dịch trong chú thích được thực hiện bằng cách khóa? – bossman

Trả lời

5

Giới thiệu

Có các loại khóa và mức cách ly khác nhau. Một số các locking types (OPTIMISTIC *) được thực hiện trên mức JPA (ví dụ: trong EclipseLink hoặc Hibernate), và khác (PESSIMISTIC *) được ủy quyền bởi nhà cung cấp JPA đến cấp DB.

Giải thích

Mức cách ly và khóa không giống nhau, nhưng chúng có thể giao nhau ở đâu đó. Nếu bạn có mức cô lập SERIALIZED (hiệu năng tham lam), thì bạn không cần bất kỳ khóa nào để thực hiện trong JPA, vì nó đã được thực hiện bởi DB. Ở phía bên kia, nếu bạn chọn READ_COMMITTED, thì bạn có thể cần phải thực hiện một số khóa, vì mức cô lập một mình sẽ không đảm bảo cho bạn, ví dụ mục nhập không bị thay đổi trong khi đó bởi một giao dịch khác.

+1

Tôi nghĩ rằng, mức độ cô lập cơ sở dữ liệu (khóa bi quan bao gồm Serializable) không quy mô cho các ứng dụng web tương tác điển hình, vì cả đọc và viết được thực hiện trong các giao dịch riêng biệt nói chung. Nó đòi hỏi một kết nối cơ sở dữ liệu và giao dịch được tổ chức mở cho toàn bộ thời gian của một chỉnh sửa (từ đọc để viết) mà là rất nhiều không mong muốn trong các ứng dụng web tương tác. – Tiny

4

Cả hai cách ly giao dịch và khóa thực thể JPA đều là cơ chế kiểm soát đồng thời.

transaction isolation được áp dụng ở cấp kết nối JDBC và phạm vi là vòng đời giao dịch (bạn không thể thay đổi cách ly giao dịch khỏi các giao dịch đang chạy). Cơ sở dữ liệu hiện đại cho phép bạn sử dụng cả hai mức cách ly 2PL (two-phase locking) và các mức cách ly MVCC (SNAPSHOT_ISOLATION hoặc mức cô lập PostgreSQL). Trong MVCC, người đọc không chặn các nhà văn và nhà văn không chặn độc giả (chỉ có người viết chặn người viết).

Các Java Persistence Locking API cung cấp cả cơ sở dữ liệu cấp và cấp ứng dụng kiểm soát đồng thời, có thể được chia làm hai loại:

  1. Explicit chế độ khóa lạc quan:

Khóa lạc quan sử dụng kiểm tra phiên bản trong câu lệnh UPDATE/DELETE và không khớp với phiên bản không khớp.

  1. Explicit chế độ khóa bi quan:

Các chế độ khóa bi quan sử dụng một cú pháp khóa cơ sở dữ liệu cụ thể để có được khóa đọc (chia sẻ) hoặc ghi (độc quyền) (ví dụ:CHỌN ... ĐỂ CẬP NHẬT).

An explicit lock mode phù hợp khi bạn chạy ở mức cô lập nhất quán thấp hơn (READ_COMMITTED) và bạn muốn lấy khóa có phạm vi là upgraded from query life-time to a transaction life-time.

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