まず、MySQLのInnoDBストレージエンジンをデフォルトで使用している場合、トランザクション分離レベルを実行してREAD UNCOMMITTEDに設定する以外に、行ロックなしでデータを更新する方法はありません
。SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
ただし、この場合はダーティリードが許可されているため、データベースの動作は期待どおりではないと思います。 READUNCOMMITTEDが実際に役立つことはめったにありません。
@Timからの回答を補足するために、where句で使用される列に一意のインデックスを付けることをお勧めします。ただし、オプティマイザが作成されたインデックスを使用してそのような実行プランを最終的に選択するという絶対的な保証はないことにも注意してください。場合によっては、機能する場合と機能しない場合があります。
あなたの場合、あなたができることは、長いトランザクションを複数の短いトランザクションに分割することです。一度に数百万行を更新する代わりに、毎回数千行だけをスキャンする方がよいでしょう。 Xロックは、短いトランザクションがコミットまたはロールバックされるたびに解放され、同時更新に進む機会を与えます。
ちなみに、あなたのバッチは他のオンラインプロセスよりも優先度が低いと思います。したがって、影響をさらに最小限に抑えるために、ピーク時間外にスケジュールすることができます。
P.S. IXロックはレコード自体にはありませんが、より粒度の高いテーブルオブジェクトにアタッチされています。また、REPEATABLE READトランザクション分離レベルでも、クエリが一意のインデックスを使用する場合、ギャップロックはありません。