Прежде всего, если вы по умолчанию используете механизм хранения InnoDB MySQL, вы не сможете обновить данные без блокировок строк, кроме как установить уровень изоляции транзакции READ UNCOMMITTED, запустив
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Однако я не думаю, что поведение базы данных - это то, что вы ожидаете, поскольку в этом случае разрешено грязное чтение. READ UNCOMMITTED редко используется на практике.
Чтобы дополнить ответ от @Tim, действительно неплохо иметь уникальный индекс для столбца, используемого в предложении where. Тем не менее, обратите внимание, что нет абсолютной гарантии, что оптимизатор в конечном итоге выберет такой план выполнения, используя созданный индекс. Это может работать или не работать, в зависимости от случая.
В вашем случае вы могли бы разделить длинную транзакцию на несколько коротких транзакций. Вместо того, чтобы обновлять миллионы строк за один снимок, лучше сканировать только тысячи строк каждый раз. Блокировки X снимаются, когда каждая короткая транзакция фиксируется или откатывается, давая возможность одновременным обновлениям продолжать работу.
Между прочим, я предполагаю, что ваша партия имеет более низкий приоритет, чем другие онлайн-процессы, поэтому ее можно запланировать в нерабочее время для дальнейшей минимизации воздействия.
P.S. Блокировка IX не для самой записи, а для объекта таблицы с более высокой гранулярностью. И даже при уровне изоляции транзакции REPEATABLE READ блокировка пробела не выполняется, когда запрос использует уникальный индекс.