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
).
Nó 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?
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? –
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. –
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. –