Làm thế nào để thực hiện chính xác khóa lạc quan trong MySQL?
Nhóm của chúng tôi đã suy luận rằng chúng tôi phải làm số 4 dưới đây nếu không có nguy cơ rằng một luồng khác có thể cập nhật cùng một phiên bản của hồ sơ, nhưng chúng tôi muốn xác thực rằng đây là cách tốt nhất để làm điều đó.
- Tạo trường phiên bản trên bảng bạn muốn sử dụng khóa tối ưu cho ví dụ tên cột = "phiên bản"
- Khi chọn, đảm bảo bao gồm cột phiên bản và ghi chú của phiên bản
- Trong lần cập nhật tiếp theo cho bản ghi, câu lệnh cập nhật sẽ phát hành "where version = X" trong đó X là phiên bản chúng tôi nhận được ở # 2 và đặt trường phiên bản trong câu lệnh cập nhật đó thành X + 1
- Thực hiện một
SELECT FOR UPDATE
bản ghi mà chúng tôi sẽ cập nhật để chúng tôi tuần tự hóa những người có thể thay đổi bản ghi mà chúng tôi đang cố gắng cập nhật.
Để làm rõ, chúng tôi đang cố gắng ngăn hai luồng chọn cùng một bản ghi trong cùng một cửa sổ trong đó chúng lấy cùng một phiên bản của bản ghi để ghi đè lên nhau nếu chúng cố gắng cập nhật bản ghi cùng một lúc. Chúng tôi tin rằng trừ khi chúng tôi làm số 4, có một cơ hội, nếu cả hai luồng nhập giao dịch tương ứng của họ cùng một lúc (nhưng chưa đưa ra bản cập nhật của họ), khi họ đi cập nhật, luồng thứ hai sẽ sử dụng CẬP NHẬT ... trong đó phiên bản = X sẽ hoạt động trên dữ liệu cũ.
Chúng ta có đúng khi nghĩ rằng chúng ta phải thực hiện khóa bi quan này khi cập nhật mặc dù chúng ta đang sử dụng các trường phiên bản / khóa lạc quan?
SELECT ... FOR UPDATE
hoặc khóa lạc quan bởi hàng versioning, không phải cả hai. Xem chi tiết trong câu trả lời.