Ja, du låser alla rader i tabellen när du har ett villkor på en oindexerad kolumn som user_id
.
Låsen gäller alla "undersökta" rader. Ditt villkor WHERE user_id = <user_id>
måste undersöka alla raderna i tabellen och testa dem en efter en för att se om de matchar värdet på <user_id>
.
Båda frågorna undersöker hela uppsättningen rader, även om de söker efter olika specifika värden för <user_id>
, så de konflikter.
Om du hade ett index på user_id
kolumn, då skulle MySQL använda det indexet för att hitta de matchande raderna först, sedan skulle bara matchande rader bli granskade rader och därför låsas.
Detta har ingenting att göra med transaktionsisoleringsnivån. Dessa typer av lås förekommer i alla transaktionsisoleringsnivåer.