Có, bạn đang khóa tất cả các hàng trong bảng khi gặp điều kiện trên cột không được lập chỉ mục như user_id
.
Các khóa áp dụng cho tất cả các hàng "được kiểm tra". Điều kiện của bạn WHERE user_id = <user_id>
phải kiểm tra tất cả các hàng trong bảng và kiểm tra từng hàng một để xem chúng có khớp với giá trị của <user_id>
.
Cả hai truy vấn đang kiểm tra toàn bộ tập hợp các hàng, ngay cả khi chúng đang tìm kiếm các giá trị cụ thể khác nhau của <user_id>
, vì vậy chúng xung đột.
Nếu bạn có một chỉ mục trên user_id
thì MySQL sẽ sử dụng chỉ mục đó để tìm các hàng phù hợp trước tiên, sau đó chỉ các hàng phù hợp mới trở thành các hàng được kiểm tra và do đó sẽ bị khóa.
Điều này không liên quan gì đến mức cô lập giao dịch. Các loại khóa này xảy ra ở tất cả các cấp độ cách ly giao dịch.