Za prvé, pokud výchozí úložiště InnoDB MySQL, pak neexistuje žádný způsob, jak aktualizovat data bez zámků řádků, kromě nastavení úrovně izolace transakcí na READ UNCOMMITTED spuštěním
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Nemyslím si však, že chování databáze je to, co očekáváte, protože nečisté čtení je v tomto případě povoleno. READ UNCOMMITTED je v praxi málokdy užitečný.
Pro doplnění odpovědi od @Tim je skutečně dobré mít jedinečný index ve sloupci použitém v klauzuli where. Upozorňujeme však také, že neexistuje žádná absolutní záruka, že optimalizátor nakonec zvolí takový plán provádění pomocí vytvořeného indexu. V závislosti na případu to může fungovat nebo ne.
Ve vašem případě byste mohli rozdělit dlouhou transakci na několik krátkých transakcí. Místo aktualizace milionů řádků najednou by bylo lepší skenovat pokaždé jen tisíce řádků. Zámky X se uvolní, když se každá krátká transakce potvrdí nebo vrátí zpět, což dává souběžným aktualizacím příležitost pokračovat.
Mimochodem, předpokládám, že vaše dávka má nižší prioritu než ostatní online procesy, takže by mohla být naplánována mimo špičku, aby se dále minimalizoval dopad.
P.S. Zámek IX není na záznamu samotném, ale je připojen k objektu tabulky s vyšší granularitou. A dokonce i na úrovni izolace transakcí REPEATABLE READ nedochází k žádnému uzamčení mezery, když dotaz používá jedinečný index.