2010-09-30 17 views
8

Tôi đã đọc this article on JPA concurrency, nhưng tôi quá dày hoặc không đủ rõ ràng.LockModeType.PESSIMISTIC_WRITE có đủ cho một UPSERT trong JPA không?

Tôi đang tìm cách thực hiện thao tác cập nhật nguyên tử-if-found-else-insert của cơ sở dữ liệu (một số UPSERT).

trông đến não chậm nghèo của tôi mà tôi có thể - trong phạm vi một giao dịch dĩ nhiên - chạy một truy vấn tên với một chế độ khóa của PESSIMISTIC_WRITE, xem nếu nó trả về bất kỳ kết quả, và sau đó hoặc là một persist() hoặc một update() sau đó.

Điều tôi không rõ ràng là sự khác biệt giữa thực hiện thao tác này với khóa PESSIMISTIC_WRITE và khóa PESSIMISTIC_READ. Tôi đã đọc các câu - Tôi hiểu rằng PESSIMISTIC_READ được dự định để ngăn không đọc lặp lại, và PESSIMISTIC_WRITE là ... tốt, có lẽ tôi không hiểu rằng một trong rất tốt :-) - nhưng bên dưới nó chỉ là một SQL SELECT FOR UPDATE, vâng? Trong cả hai trường hợp?

+0

Hi Laird. Bạn có cơ hội để làm việc này không? Có phát hiện thú vị nào không? –

+0

Tôi chưa có thời gian để tìm hiểu và xem điều gì đang diễn ra. Tôi đặt trong một khóa PESSIMISTIC_WRITE vì bài báo tương tranh dường như đang cố gắng nhấn mạnh rằng điều này sẽ cho phép tôi thực hiện một UPSERT không có điều kiện chủng tộc. Tangent: một UPSERT có vẻ giống như một hoạt động phổ biến không thể tin được rằng PHẢI là một cách để thực hiện nó trong JPA. –

+1

Tôi có cảm giác mình nhớ điều gì đó ở đây. Tại sao bạn không thể chỉ cần tìm find() + insert() nếu cần thiết. Tôi cho rằng giao dịch sẽ đảm bảo nguyên tử? Tôi nghĩ rằng loại khóa là ít quan trọng, thậm chí bạn có thể sử dụng khóa + phiên bản lạc quan? Tôi cho rằng các mục trùng lặp được bảo vệ bằng cách sử dụng một ràng buộc duy nhất. –

Trả lời

4

Tôi đang tìm cách thực hiện thao tác cập nhật nguyên tử-if-found-else-insert của cơ sở dữ liệu (một UPSERT).

tôi có thể không trả lời chính xác toàn bộ câu hỏi, nhưng nếu bạn muốn thực hiện ở trên mà không cần bất kỳ điều kiện chủng tộc, bạn cần IMO một bảng cấp KHÓA trong chế độ ĐỘC QUYỀN (không chỉ hàng). Tôi không biết nếu điều này có thể được thực hiện với JPA. Có lẽ bạn có thể làm rõ những gì sẽ được chấp nhận cho bạn.

2

tôi đã phải đối mặt với tình huống này và thấy điều này:

Bi quan khóa, có nghĩa là khóa của các đối tượng trên giao dịch bắt đầu và giữ khóa trong giao dịch được thực hiện bằng những 2 PessimisticLockModes: - LockModeType.PESSIMISTIC_READ -> thực thể có thể được đọc bởi các giao dịch khác nhưng không có thay đổi có thể được thực hiện - LockModeType.PESSIMISTIC_WRITE -> thực thể không thể đọc hay viết bởi các giao dịch khác

link đến bài viết

0

Tôi đang tìm kiếm để làm một nguyên tử hoạt động update-if-thấy-else-chèn cơ sở dữ liệu điều khiển (một UPSERT).

INSERT .. ON DUPLICATE KEY UPDATE làm điều đó.