はい、user_id
のようなインデックス付けされていない列に条件がある場合、テーブル内のすべての行をロックしています。 。
ロックは、すべての「検査済み」行に適用されます。あなたの条件WHERE user_id = <user_id>
すべてを調べる必要があります テーブル内の行を1つずつテストして、<user_id>
の値と一致するかどうかを確認します。 。
どちらのクエリも、<user_id>
の特定の値を検索しているにもかかわらず、行のセット全体を調べています。 、したがって、競合します。
user_id
にインデックスがある場合 列の場合、MySQLはそのインデックスを使用して最初に一致する行を検索し、次に一致する行のみが検査対象の行になるため、ロックされます。
これは、トランザクション分離レベルとは何の関係もありません。これらのタイプのロックは、すべてのトランザクション分離レベルで発生します。