Oui, vous verrouillez toutes les lignes de la table lorsque vous avez une condition sur une colonne non indexée comme user_id
.
Les verrous s'appliquent à toutes les lignes "examinées". Votre état WHERE user_id = <user_id>
doit examiner tous les lignes du tableau et testez-les une par une pour voir si elles correspondent à la valeur de <user_id>
.
Les deux requêtes examinent l'ensemble des lignes, même si elles recherchent différentes valeurs spécifiques de <user_id>
, donc ils sont en conflit.
Si vous aviez un index sur le user_id
colonne, MySQL utiliserait cet index pour trouver les lignes correspondantes en premier, puis seules les lignes correspondantes deviendraient des lignes examinées et seraient donc verrouillées.
Cela n'a rien à voir avec le niveau d'isolement de la transaction. Ces types de verrous se produisent à tous les niveaux d'isolation des transactions.