Tôi có một mục và Jobs bảng:Khả năng tương thích và tuần tự của Postgres. Tôi có cần mức cách ly SERIALIZABLE không?
Items
- id = PK
- job_id = Jobs FK
- status = IN_PROGRESS | COMPLETE
Jobs
- id = PK
Items bắt đầu ra như IN_PROGRESS, nhưng công việc được thực hiện trên chúng, và đưa ra một công nhân để cập nhật. Tôi có một quá trình cập nhật đang cập nhật các mục khi họ đến, với một trạng thái mới. Cách tiếp cận mà tôi đã thực hiện cho đến nay là (trong mã giả):
def work(item: Item) = {
insideTransaction {
updateItemWithNewStatus(item)
jobs, items = getParentJobAndAllItems(item)
newJobStatus = computeParentJobStatus(jobs, items)
// do some stuff depending on newJobStatus
}
}
Điều đó có hợp lý không? Tôi muốn điều này làm việc trong một môi trường đồng thời. Vấn đề tôi có ngay bây giờ, là COMPLETE được đưa ra nhiều lần cho một công việc, khi tôi chỉ muốn làm logic trên COMPLETE, một lần.
Nếu tôi thay đổi cấp độ giao dịch thành SERIALIZABLE, tôi nhận được thông báo "L ERI: không thể tuần tự hóa truy cập do đọc/ghi phụ thuộc giữa các giao dịch" như mô tả.
Vì vậy, câu hỏi của tôi là:
- Tôi có cần SERIALIZABLE?
- Tôi có thể lấy đi bằng SELECT FOR UPDATE và ở đâu không?
- Ai đó có thể giải thích cho tôi điều gì đang xảy ra và tại sao?
Chỉnh sửa: Tôi đã mở lại câu hỏi này vì tôi không hài lòng với giải thích câu trả lời trước đó. Có ai có thể giải thích điều này cho tôi không? Cụ thể, tôi muốn một số truy vấn mẫu cho mã giả đó.
Cảm ơn bạn, đây là một câu trả lời tuyệt vời. Vì vậy, SELECT CHO CẬP NHẬT trên một tham gia khóa tất cả mọi thứ tôi cần? –
Trừ khi bạn chỉ rõ một cách rõ ràng trên bảng nào để áp dụng khóa, tất cả các bảng trong truy vấn sẽ khóa tất cả các hàng bị ảnh hưởng. – Patrick
Ah. Đuợc. Cảm ơn –