Tôi có một v_ext bảng trong một MySQL với InnoDB:
- id: chính chủ chốt
- Mã: pre-tạo danh sách các mã (nói 1000 mã được tạo ngẫu nhiên)
- user_id: ban đầu NULLMySQL InnoDB SELECT ... LIMIT 1 FOR UPDATE Vs CẬP NHẬT ... LIMIT 1
Khi người dùng mua một mặt hàng, họ sẽ nhận được mã. Tôi cần cập nhật bảng để điền cột user_id. Tôi có hai lựa chọn:
START TRANSACTION;
SELECT id FROM v_ext WHERE user_id IS NULL LIMIT 1 FOR UPDATE; -- return id 54 for ex.
UPDATE v_ext SET user_id=xxx WHERE id=54;
COMMIT;
hoặc
UPDATE v_ext SET user_id=xxx WHERE user_id IS NULL LIMIT 1;
là tùy chọn thứ hai an toàn nếu tôi có hàng ngàn người dùng mua cùng một lúc? Nếu vậy, có đúng không khi giả sử tùy chọn thứ hai này tốt hơn cho hiệu suất vì nó chỉ cần một truy vấn?
Có ràng buộc 'UNIQUE' trên' user_id' không? (nghĩa là người dùng chỉ có thể có một mã)? – eggyal
'EXISTS' sẽ là sử dụng tốt hơn về mặt đồng thời và hiệu suất. – bonCodigo
UNIQUE không phải là một ràng buộc, user_id có thể nhận được nhiều mã khi họ mua hàng – JScoobyCed