Tak, blokujesz wszystkie wiersze w tabeli, gdy masz warunek na niezindeksowanej kolumnie, taki jak user_id
.
Blokady dotyczą wszystkich „zbadanych” rzędów. Twój stan WHERE user_id = <user_id>
musi zbadać wszystkie wiersze w tabeli i przetestuj je jeden po drugim, aby sprawdzić, czy pasują do wartości <user_id>
.
Oba zapytania sprawdzają cały zestaw wierszy, mimo że szukają różnych określonych wartości <user_id>
, więc są sprzeczne.
Gdybyś miał indeks na user_id
kolumna, wtedy MySQL użyje tego indeksu, aby najpierw znaleźć pasujące wiersze, a następnie tylko pasujące wiersze zostaną zbadane, a zatem zostaną zablokowane.
Nie ma to nic wspólnego z poziomem izolacji transakcji. Tego typu blokady występują na wszystkich poziomach izolacji transakcji.