Sì, stai bloccando tutte le righe della tabella quando hai una condizione su una colonna non indicizzata come user_id
.
I blocchi si applicano a tutte le righe "esaminate". La tua condizione WHERE user_id = <user_id>
deve esaminare tutti le righe nella tabella e testale una per una per vedere se corrispondono al valore di <user_id>
.
Entrambe le query stanno esaminando l'intero set di righe, anche se stanno cercando diversi valori specifici di <user_id>
, quindi sono in conflitto.
Se avevi un indice su user_id
colonna, quindi MySQL utilizzerà quell'indice per trovare prima le righe corrispondenti, quindi solo le righe corrispondenti diventerebbero righe esaminate e quindi sarebbero bloccate.
Questo non ha nulla a che fare con il livello di isolamento della transazione. Questi tipi di blocchi si verificano in tutti i livelli di isolamento delle transazioni.