Trước hết, nếu bạn đặt mặc định trên công cụ lưu trữ InnoDB của MySQL, thì không có cách nào bạn có thể cập nhật dữ liệu mà không có khóa hàng ngoại trừ việc đặt mức cách ly giao dịch xuống ĐỌC KHÔNG ĐƯỢC ĐỀ XUẤT bằng cách chạy
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Tuy nhiên, tôi không nghĩ rằng hành vi cơ sở dữ liệu là những gì bạn mong đợi vì việc đọc bẩn được cho phép trong trường hợp này. READ UNCOMMITTED hiếm khi hữu ích trong thực tế.
Để bổ sung cho câu trả lời từ @Tim, thực sự là một ý kiến hay nếu bạn có một chỉ mục duy nhất trên cột được sử dụng trong mệnh đề where. Tuy nhiên, cũng xin lưu ý rằng không có đảm bảo tuyệt đối rằng trình tối ưu hóa cuối cùng sẽ chọn kế hoạch thực thi như vậy bằng cách sử dụng chỉ mục được tạo. Nó có thể hoạt động hoặc không hoạt động, tùy trường hợp.
Đối với trường hợp của bạn, những gì bạn có thể làm là chia giao dịch dài thành nhiều giao dịch ngắn. Thay vì cập nhật hàng triệu hàng trong một lần chụp, chỉ quét hàng nghìn hàng mỗi lần sẽ tốt hơn. Các khóa X được phát hành khi mỗi giao dịch ngắn hạn cam kết hoặc quay lại, tạo cơ hội cho các bản cập nhật đồng thời được tiếp tục.
Nhân tiện, tôi giả sử rằng lô của bạn có mức độ ưu tiên thấp hơn các quy trình trực tuyến khác, do đó, nó có thể được lên lịch ngoài giờ cao điểm để giảm thiểu tác động hơn nữa.
P.S. Khóa IX không nằm trong bản ghi mà được gắn vào đối tượng bảng có độ chi tiết cao hơn. Và ngay cả với mức cách ly giao dịch REPEATABLE READ, không có khóa khoảng cách khi truy vấn sử dụng một chỉ mục duy nhất.