Vấn đề của bạn bắt nguồn từ câu hỏi về "khóa đồng bộ hóa nên là gì" . Từ câu hỏi của bạn, có vẻ như đặt phòng không phải là đặt một mặt hàng cụ thể. Nhưng hãy giả sử rằng một người dùng đang đặt một phòng khách sạn cụ thể, vì vậy bạn cần giải quyết hai vấn đề:
- ngăn việc đặt trước quá nhiều (ví dụ:đặt cùng một thứ cho hai người)
- ngăn chặn tính toán sai trạng thái tài khoản song song
Vì vậy, khi người dùng đến một thời điểm khi họ chuẩn bị nhấn xác nhận , đây là một tình huống có thể xảy ra mà bạn có thể thực hiện:
-
bắt đầu giao dịch
-
khóa mục nhập của người dùng để các quá trình song song bị chặn
SELECT * FROM user FOR UPDATE WHERE id = :id
-
kiểm tra lại số dư tài khoản và đưa ra ngoại lệ / hoàn trả nếu không có đủ tiền
-
khóa mặt hàng cần đặt để tránh đặt trước quá nhiều
SELECT * FROM room FOR UPDATE WHERE id = :id
-
kiểm tra lại tình trạng còn hàng của lượt đặt trước và đưa ra trường hợp ngoại lệ / hoàn trả nếu mặt hàng đã được đặt trước
-
tạo mục đặt chỗ và trừ tiền từ tài khoản của người dùng
-
cam kết giao dịch (tất cả các khóa sẽ được giải phóng)
Trong trường hợp của bạn, nếu bạn không cần kiểm tra việc đặt trước quá nhiều, chỉ cần bỏ qua / bỏ qua bước 4 và 5.