Først og fremmest, hvis du som standard er på InnoDB-lagringsmotoren i MySQL, så er der ingen måde, du kan opdatere data uden rækkelåse, bortset fra at indstille transaktionsisolationsniveauet ned til LÆS UFOLKET ved at køre
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Jeg tror dog ikke, at databaseadfærden er, hvad du forventer, da den beskidte læsning er tilladt i dette tilfælde. LÆS UENGAGELIGT er sjældent nyttigt i praksis.
For at supplere svaret fra @Tim er det faktisk en god idé at have et unikt indeks på kolonnen, der bruges i where-sætningen. Bemærk dog også, at der ikke er nogen absolut garanti for, at optimeringsværktøjet til sidst vil vælge en sådan eksekveringsplan ved hjælp af det oprettede indeks. Det kan virke eller ej, afhængigt af sagen.
For dit tilfælde, hvad du kunne gøre er at opdele den lange transaktion i flere korte transaktioner. I stedet for at opdatere millioner af rækker i ét skud, ville det være bedre at scanne kun tusindvis af rækker hver gang. X-låsene frigives, når hver kort transaktion commits eller rollbacks, hvilket giver de samtidige opdateringer mulighed for at gå videre.
I øvrigt antager jeg, at din batch har lavere prioritet end de andre online-processer, så den kan planlægges uden for myldretiden for yderligere at minimere påvirkningen.
P.S. IX-låsen er ikke på selve posten, men knyttet til tabelobjektet med højere granularitet. Og selv med GENTAGBART LÆS transaktionsisolationsniveau er der ingen hullås, når forespørgslen bruger et unikt indeks.