2009-11-01 15 views
32

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

13

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.

+2

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

+0

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

+0

@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

5

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

28

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:

JPA 2.1

5

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 locksthis article about JPA pessimistic lock types.

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